2011-10-20 64 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)}