2011-10-20 37 views
0

请原谅我对这个问题的认识不足,因为它很基本,但我有一个可为空的 [DateTime]列,我想使用LINQ查询来选择记录每个用户通过连接找到的最大“时间戳”。查找LINQ查询中的MAX日期加入

这是我目前的查询。

return (from t1 in db.BU 
       from t2 in db.UserNames 
       .Where(t => (t.User_Username == t1.Username)) 
       from t3 in db.Logins 
       .Where(t => (t.username == t1.Username)) 
       where myBusinessUnits.Contains(t1.BusinessUnit_ID) 
       orderby (t2.Name) descending 
       select new GlobalMyTeamDetailModel 
       { 
        LastLogin = t3.timestamp, 
        Name = t2.Name 

       }); 

如果有人能帮助我,我会很感激。

这是我想要为每个用户获取的“登录”表的最大值。

编辑:另一种尝试,其并没有得到预期的结果:通过时间戳

 var result = 
      (from t1 in db.LoginHistories 
      where t1.username == user 

      from t2 in db.UserNames 
       .Where(t => (t.User_Username == t1.username)) 

      from t3 in db.UserBusinessUnits 
       .Where(t => (t.Username == t1.username)) 

      where myBusinessUnits.Contains(t3.BusinessUnit_ID) 

      group t1 by new { t1.username } into g 
      let MaxDate = g.Max(uh => uh.timestamp) 

      select new GlobalMyTeamDetailModel 
       { 
        LastLogin = MaxDate, 
        Name = g.Key.username 
       }); 
+0

你真的有加入这些表?您可以通过将其中的用户名列分组,从登录表中获取最后一次登录。 –

+0

我尝试了一些不同的东西,并将其添加到问题中。它仍然返回所有记录。你能推荐吗? – Nick

回答

1

如果你总是有至少一排连接,排序t3和取第一个(应该是最大的值) 。

return (from t1 in db.BU 
      from t2 in db.UserNames 
      .Where(t => (t.User_Username == t1.Username)) 
      from t3 in db.Logins 
      .Where(t => (t.username == t1.Username)) 
      .OrderBy(u => u.timestamp).First()   // <--------- add this 
      where myBusinessUnits.Contains(t1.BusinessUnit_ID) 
      orderby (t2.Name) descending 
      select new GlobalMyTeamDetailModel 
      { 
       LastLogin = t3.timestamp, 
       Name = t2.Name 

      }); 
+0

感谢您的回应,但这会导致“源类型为IQueryable的查询表达式中的后续from子句不允许使用类型'Login'的表达式。调用SelectMany()时类型接口失败 – Nick

0

使用GROUP BY和Max在LINQ像下面

From p In db.Products _ 
      Group p By p.CategoryID Into g = Group _ 
      Select New With {g, .MaxPrice = g.Max(Function(p) p.UnitPrice)}