首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从实体框架中的查询中获取多个不同的值

从实体框架中的查询中获取多个不同的值
EN

Stack Overflow用户
提问于 2017-08-29 02:34:20
回答 2查看 84关注 0票数 0

我正在运行一个查询,它将根据位置搜索和日期获得结果。我有一个包含位置点(经度/经度)的geography列,该列已编入索引。当我搜索某个日期的事件时,它会搜索该日期某个距离(半径)内的所有事件。

问题是,如果有10个事件,都在同一天的同一地点,所有10个结果将在第一页返回。我想把这一点混为一谈,只显示每个位置的2-3个,以使结果集具有一定的多样性,这样用户就不会只看到一个位置的所有事件。

我知道我可以使用distinct从每个位置只获取一个事件,但我如何使用它来获取2-3个不同的值?

到目前为止,我的查询如下。

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

发布于 2017-08-29 03:29:15

我不认为有一种方法可以让EF生成这样的查询,SQL Server的查询应该是这样的:

代码语言:javascript
复制
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个城市,依此类推。

或者,您可以获取所有匹配的事件,并在内存中对它们进行排序。

票数 0
EN

Stack Overflow用户

发布于 2017-08-29 05:02:54

我认为你应该能够这样做:

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45925337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档