LINQ选择每组最大日期的行

时间:2013-05-26 10:13:04

标签: linq

我想从我的"类别"中返回所有值。表并将其加入我的" CategorySelections"表以显示所有类别以及指定的用户是否选择了它们。 复杂性(我不知道如何在LINQ中处理)是用户可以随着时间的推移改变他对特定类别的选择/取消选择...每个更改都会记录在" CategorySelections& #34;带有日期戳的桌子。 我是最后一个选择状态。

以下SQL查询执行我想要的操作:

     SELECT cs.UserId, c.CategoryId, m.MaxDate, cs.IsSelected
  FROM [myDB].[dbo].[Categories] c
  LEFT JOIN [myDB].[dbo].[CategorySelections] cs
  ON c.CategoryID = cs.CategoryID AND cs.UserID = 7
  INNER JOIN
  (
    SELECT UserId, CategoryId, Max(CreatedOn) as MaxDate
    FROM [myDB].[dbo].[CategorySelections]
    GROUP BY UserId, CategoryId
  ) m
  ON cs.UserID = m.UserID AND cs.CategoryID = m.CategoryID AND cs.CreatedOn = m.MaxDate
  ORDER BY cs.CategoryI

我需要一些帮助才能在LINQ中完成这项工作。 下面是我的尝试,它返回所有选择而不是每个类别的最后一个。

var query = from c in db.Category
join cs in db.CategorySelection.Where(x => x.UserID == WebSecurity.CurrentUserId)
on c.CategoryID equals cs.CategoryID into JoinedCategory
from cs in JoinedCategory.DefaultIfEmpty()
select new Selection() { CategoryID = c.CategoryID, CategoryName = c.CategoryName       ,IsSelected = cs != null ? cs.IsSelected : false }

我在MVC工作; "新选择()"指的是我的模型

1 个答案:

答案 0 :(得分:1)

您可以添加WHERE语句:

where cs.CreatedOn == CategorySelections.Where(t => t.CategoryId == cs.CategoryId).Max(r => r.CreatedOn)