2009-11-10 1 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

Имейте в виду, что это не нарушит связь - если есть две строки с одинаковыми CustID и той же AccessDAte, они оба будут найдены в соединении, и вы могли бы в конечном итоге с несколькими «самых последних доступов «на идентификатор клиента». –

 Смежные вопросы

  • Нет связанных вопросов^_^