2009-11-10 30 views
27

考慮用於存儲事件以進行審計的SQL Server表。LINQ to SQL:GroupBy()和Max()獲取最新日期的對象

需要爲每個CustID獲取最新條目的。我們想要獲取整個對象/行。我假設在查詢中需要GroupBy()。這裏的查詢到目前爲止:

var custsLastAccess = db.CustAccesses 
         .Where(c.AccessReason.Length>0) 
         .GroupBy(c => c.CustID) 
//      .Select() 
         .ToList(); 
// (?) where to put the c.Max(cu=>cu.AccessDate) 

Custs Layout

問題: 如何創建查詢以選擇最新的(最大AccessDate)記錄/每個CustID對象?

回答

26

我想知道如果是這樣的:

var custsLastAccess = db.CustAccesses 
        .Where(c.AccessReason.Length>0) 
        .GroupBy(c => c.CustID) 
        .Select(grp => new { 
         grp.Key, 
         LastAccess = grp.OrderByDescending(
          x => x.AccessDate).FirstOrDefault() 
        }).ToList(); 

,你也可以嘗試OrderBy()Last()

0
var custsLastAccess = db.CustAccesses 
          .Where(c.AccessReason.Length>0) 
         .GroupBy(c => c.CustID, (id, custs) => new { ID=id, LastAccess=custs.OrderByDescending(c=>c.AccessDate).First().AccessDate}) 
         .Select() 
         .ToList(); 
18

使用LINQ語法,我覺得看起來比較清爽:

var custsLastAccess = from c in db.CustAccesses 
         group c by c.CustID into grp 
         select grp.OrderByDescending(c => c.AccessDate).FirstOrDefault(); 
3

這裏:這個使用了max而不是OrderByDesc,所以應該更有效率。

var subquery = from c in CustAccesses 
      group c by c.CustID into g 
      select new 
      { 
       CustID = g.Key, 
       AccessDate = g.Max(a => a.AccessDate) 
      }; 
var query = from c in CustAccesses 
      join s in subquery 
       on c.CustID equals s.CustID 
      where c.AccessDate == s.AccessDate 
      && !string.IsNullOrEmpty(c.AccessReason) 
      select c; 
+1

要知道,這不會打破僵局 - 如果有兩行用相同的客戶ID和相同AccessDAte,他們都將被在加入中發現,你可能最終得到多個「最近訪問「每個客戶的ID。 – 2013-09-10 18:51:31