我正在运行一个查询,该查询将根据位置搜索和日期获得结果。我有一个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);
答案 0 :(得分:0)
我认为没有办法让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,等等。
或者你可以获取所有匹配的事件并在内存中对它们进行排序。
答案 1 :(得分:0)
我认为你应该能够做到这样的事情:
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);