2012-02-15 87 views
5

请帮我将此转换为Lambda表达式的LINQ to SQL的GroupBy MAX()拉姆达

SELECT [UserID], MAX(Created) Created 
FROM [UserHistory] 
WHERE userid IN (14287) 
GROUP BY [UserID] 

谢谢!编辑: 这是我到目前为止。

List<T> list; //list is populated 

table.Where(x => list.Select(y => y.ClientId).Contains(x.UserID)) 
        .GroupBy(x => x.UserID) 
        .Select(x => new { x.UserID, x.Created }) 
        .ToList(); 

当我添加GroupBy时,我的Select表示没有x.UserID和x.Created的定义。

+3

你卡在了什么? – Krizz 2012-02-15 22:54:38

+0

当我添加组时,我的选择休息。这个小组是否通过消除所有其他领域或某些东西? – Kukoy 2012-02-15 22:56:37

+1

请记住,在group by之后,您有'IEnumerable >'而不是原来的'IEnumerable ''。下面的人向你展示了这个事实的实际例子。 – Krizz 2012-02-15 23:01:10

回答

11

在这里你去:

var userIDs = new[] {14287, }; 

var results = 
dataContext.UserHistories 
.Where(user => userIDs.Contains(user.userID)) 
.GroupBy(user => user.userID) 
.Select(
    userGroup => 
     new 
     { 
      UserID = userGroup.Key, 
      Created = userGroup.Max(user => user.Created), 
     }); 
+0

完美,谢谢。 – Kukoy 2012-02-15 23:09:36

0
var query = from history in context.UserHistories 
       where (new[] {14287}).Contains(history.userID) 
       group history by history.UserID into g 
      select new 
      { 
       UserId = g.Key, 
       MaxCreated = g.Max(x => x.Created) 
      }; 
+0

您错过了'WHERE userid IN(14287)'短语。 – Krizz 2012-02-15 22:58:19

+0

没错。谢谢你的提示。 – Meligy 2012-02-15 23:40:38

+0

原帖需要lambda – jgerman 2015-04-10 20:24:25

0

关于你的编辑,我在评论说,在.Select(x => new { x.UserID, x.Created })x不再一个UserHistory,它是IGrouping<int, UserHistory>(1),这不具有UserIDCreated属性,但只有Key属性,该属性是用户标识并实施IEnumerable来枚举给定键(用户标识)的所有项目。

使用@DaveShaw片段,因为它是最正确和最有效的片段。

(1)我假设UserIDint