【问题标题】:Get ordered group last item获取有序组的最后一项
【发布时间】:2016-07-23 06:37:05
【问题描述】:

我有一个与用户相关的项目列表。

每个项目都有一个日期。
我想获取每个用户的最后一项(按日期)

例如,如果数据是:

Id1, User1, 1.1.16 
Id2, User2, 2.1.16 
Id1, User1, 4.1.16 
Id4, User2, 3.1.16 
Id3, User1, 2.1.16 
Id4, User2, 5.1.16 

它应该返回每个用户的最后一项(按日期):

Id1 User1 4.1.16
Id4 User2 5.1.16

我的查询是:

from sf in db.Items
where ...
group i by i.UserId into g
select g.OrderByDescending(s => s.StartDate).FirstOrDefault();


由于某种原因,它总是获取用户的第一项。
当我打印所有组及其项目时,它看起来不错,
第一项是每个组中的最后一项,但查询不返回它。

我尝试更改为g.OrderBy..没有帮助
还尝试添加g.ToList()...
如何获取每个用户的最新商品?

如果我将查询更改为
,它确实有效 ... 通过 i.UserId 将 i 分组到 g
选择 g.OrderByDescending(s => s.StartDate)

当我循环组时,我采取第一项
foreach(查询中的 var g)
{
var last = g.First();

【问题讨论】:

    标签: c# mysql linq entity-framework-6


    【解决方案1】:

    你需要这样的东西:

    var result = from sf in db.Items
                 where ...
                 group i by i.UserId into gr
                 select new 
                 {
                     UserId = gr.Key
                     LatestItem = gr.OrderByDescending(s => s.StartDate)
                                    .FirstOrDefault()
                 };
    

    进行分组后,您将每个组投影到具有两个属性的匿名类型对象中。第一个属性是组的键,UserId。而第二个是该用户的LatestItem

    【讨论】:

    • 不幸的是我得到了同样的结果。只有当我选择整个组而不是当我在组上循环时我选择第一个时,它才会起作用。 foreach (var gr in resultQuesry) var last = gr.First();
    猜你喜欢
    • 2017-09-29
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2014-09-26
    相关资源
    最近更新 更多