2016-04-03 194 views
2

我有一个与用户相关的项目列表。获取订单组的最后一项

每个项目都有一个日期。
我想每个用户

例如的最后一个项目(按日期),如果数据是:

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 ..didn't帮助
也尝试添加g.ToList() ...
我怎样才能得到每个用户的最新项目?

如果即时通讯改变查询
它工作... 通过i.UserId组i成克
选择g.OrderByDescending(S => s.StartDate)

和比当我循环的组我取第一项
foreach(查询中的变量)
{
var last = g.First();

回答

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

+0

不幸的是,我得到了同样的结果。只有当我选择整个组,并且当我循环选择第一组时,它才会打开。 foreach(var gr in resultQuesry)var last = gr.First(); –