我正在运行一个查询,它将根据位置搜索和日期获得结果。我有一个包含位置点(经度/经度)的geography列,该列已编入索引。当我搜索某个日期的事件时,它会搜索该日期某个距离(半径)内的所有事件。
问题是,如果有10个事件,都在同一天的同一地点,所有10个结果将在第一页返回。我想把这一点混为一谈,只显示每个位置的2-3个,以使结果集具有一定的多样性,这样用户就不会只看到一个位置的所有事件。
我知道我可以使用distinct从每个位置只获取一个事件,但我如何使用它来获取2-3个不同的值?
到目前为止,我的查询如下。
viewModel.Events = dbContext.YogaSpaceEvents
.Where(i => i.EventDateTime >= adjustedSearchDate &&
i.LocationPoints.Distance(location) <= radius)
.Distinct()
.OrderBy(i => i.EventDateTime)
.Select(i => new EventResult
{
//fill view model here
})
.ToPagedList(Page, 10);发布于 2017-08-29 03:29:15
我不认为有一种方法可以让EF生成这样的查询,SQL Server的查询应该是这样的:
with q as
(
select *,
( row_number() over (partition by StateProvinceId order by CityID) -1 ) / 3 MyRanking
from Application.Cities
)
select CityId, CityName,StateProvinceID
from q
order by MyRanking, StateProvinceID, CityID
offset 10 rows
fetch next 20 rows only请注意,此示例没有使用距离。但想法是相同的:每个州的前3个城市首先被返回,然后是下一个3个城市,依此类推。
或者,您可以获取所有匹配的事件,并在内存中对它们进行排序。
发布于 2017-08-29 05:02:54
我认为你应该能够这样做:
dbContext.YogaSpaceEvents
.Where(i => i.EventDateTime >= adjustedSearchDate &&
i.LocationPoints.Distance(location) <= radius)
.GroupBy(i => i.Geography)
.SelectMany(g => g.OrderBy(x => x.EventDateTime).Take(3))
.Select(i => new EventResult { //fill view model here })
.ToPagedList(Page, 10);https://stackoverflow.com/questions/45925337
复制相似问题