Як вибрати лише записи з найвищою датою в LINQ


117

У мене є таблиця "lasttraces" із наступними полями.

Id, AccountId, Version, DownloadNo, Date

Дані виглядають приблизно так:

28092|15240000|1.0.7.1782|2009040004731|2009-01-20 13:10:22.000
28094|61615000|1.0.7.1782|2009040007696|2009-01-20 13:11:38.000
28095|95317000|1.0.7.1782|2009040007695|2009-01-20 13:10:18.000
28101|15240000|1.0.7.1782|2009040004740|2009-01-20 14:10:22.000
28103|61615000|1.0.7.1782|2009040007690|2009-01-20 14:11:38.000
28104|95317000|1.0.7.1782|2009040007710|2009-01-20 14:10:18.000

Як я можу в LINQ до SQL отримати лише останню останню сліду кожного AccountId (той, який має найвищу дату)?


насправді у вашому прикладі всі журнали з однаковим ідентифікатором облікового запису мають точно таку ж дату, тож якому ви бажаєте скористатись у такому випадку?
BlackTigerX

Відповіді:


230

Якщо ви просто хочете останню дату для кожного облікового запису, ви скористаєтеся цим:

var q = from n in table
        group n by n.AccountId into g
        select new {AccountId = g.Key, Date = g.Max(t=>t.Date)};

Якщо ви хочете весь запис:

var q = from n in table
        group n by n.AccountId into g
        select g.OrderByDescending(t=>t.Date).FirstOrDefault();

2
Oracle цього не підтримує. Якщо продуктивність запиту не враховується, ви можете перетворити таблицю ToList перед тим, як виконати запит.
Буде Ву

8
Було б чудово, якщо ви можете опублікувати method-chainрішення для цього.
LCJ

другий запит - чи не має бути (from n in table ...).First()?
Джейсон Л

@JasonL, ні. First()Виклик повинен застосовуватися до g.Order...вираженню (підзапит).
Мехрдад Афшарі

1
@Mehrdad Afshari дивовижний , я хотів, перш за все, другий, але вони обидва зараз у моїх фрагментах, як дуже корисні . Дякую, дякую, дякую !!!!!
Андрій День

52

Ось простий спосіб зробити це

var lastPlayerControlCommand = this.ObjectContext.PlayerControlCommands
                                .Where(c => c.PlayerID == player.ID)
                                .OrderByDescending(t=>t.CreationTime)
                                .FirstOrDefault();

Також подивіться це чудове місце LINQ - LINQ для SQL Samples


25
Це рішення чудово працює, якщо ви запитували на рахунок, але не виконуєте те, що вказано в ОП, а це отримати останній результат для всіх записів без надання облікового запису (у вашому випадку PlayerId)
Maciej

1
Це рішення надихнуло мене на замовлення, щоб спробувати вибрати максимум. +1
Разван Думітру

Це рішення може призвести до "Послідовність не містить елементів" Помилка Linq правда?
xSkrappy

34

Якщо ви хочете весь запис, ось лямбда спосіб:

var q = _context
             .lasttraces
             .GroupBy(s => s.AccountId)
             .Select(s => s.OrderByDescending(x => x.Date).FirstOrDefault());

1
Працював чудово. Дякую.
Террі

Тут і є ключовим.
Джейсон P Sallinger

5

Це може бути щось на кшталт:

var qry = from t in db.Lasttraces
          group t by t.AccountId into g
          orderby t.Date
          select new { g.AccountId, Date = g.Max(e => e.Date) };

3

Отримайте простий спосіб зробити це: -

Створено один клас для вміщення наступної інформації

  • Рівень (кількість)
  • URL (URL-адреса сайту)

Перейдіть до списку сайтів, що зберігаються на об’єкті ArrayList. І виконується наступний запит, щоб сортувати його у порядку зменшення за рівнем.

var query = from MyClass object in objCollection 
    orderby object.Level descending 
    select object

Як тільки я зібрав колекцію, сортувавшись у порядку зменшення, я написав наступний код, щоб отримати Об'єкт, що надходить як верхній рядок

MyClass topObject = query.FirstRow<MyClass>()

Це спрацювало як шарм.


Це дало мені кращу ідею, ніж моя первісна думка. Дякую!
Paulj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.