从Entity Framework中的查询中获取多个不同的值

时间:2017-08-28 18:34:20

标签: sql entity-framework lambda

我正在运行一个查询,该查询将根据位置搜索和日期获得结果。我有一个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);

2 个答案:

答案 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);