2015-11-13 2 views
-1

Я хочу получить последнюю запись каждой группы из таблицы SQL Server с помощью Linq.Linq: выберите самую последнюю запись каждой группы

Таблица Пример:

Original data

Я хочу, чтобы получить этот результат:

Desired result

Мой Linq запрос возвращает одну запись для каждой компании, но он не возвращает наиболее последние:

var query = from p in db.Payments 
      where p.Status == false 
      && DateTime.Compare(DateTime.Now, p.NextPaymentDate.Value) == 1 
      group p by p.CompanyID into op           
      select op.OrderByDescending(nd => nd.NextPaymentDate.Value).FirstOrDefault(); 

Что мне здесь не хватает? Почему заказ NextPaymentDate не упорядочен правильно?

!! UPDATE !! Мой запрос работает должным образом. После анализа комментариев @Gilang и @JonSkeet я провел дополнительные тесты и обнаружил, что я не получил ожидаемые результаты из-за не обновляемого столбца.

+0

Это выглядит правильно для меня - 2015-11-13 03: 30: 50.127 * есть * самый последний результат в каждом случае. Какой результат, по вашему мнению, более поздний, чем этот? –

+0

@JonSkeet это изображение является примером того, чего я хочу достичь. Реальный результат показывает старые записи (2015-11-13 03:12:21). – Ricky

+0

Ах. Это помогает, если вы показываете, что вы на самом деле получаете ... извинения за неправильное понимание вопроса. –

ответ

1
var query = from p in db.Payments 
      where p.Status == false 
      group p by p.CompanyID into op 
      select new { 
       CompanyID = op.Key, 
       NextPaymentDate = op.Max(x => x.NextPaymentDate), 
       Status = false 
      }; 

Причина, по которой ваш запрос не упорядочен правильно, заключается в том, что ваш запрос не выполняет правильную группировку. Вы правильно группировали CompanyID, но затем вам нужно получить максимальный параметр NextPaymentDate, вызвав функцию aggregate.

Статус может быть назначен false, поскольку он уже отфильтрован предложением Where в ранних предложениях.

+0

Что касается LINQ, запрос OP в порядке. Он выбирает группы, а затем выбирает один элемент внутри каждой группы. Насколько мне известно, он отлично работал бы в LINQ to Objects. Если он не преобразуется в правильный SQL, это звучит как ошибка в конвертере SQL для меня. –

+0

@ Gilang Ваше решение, похоже, работает. Мне нужно проверить его дальше, чтобы знать наверняка. У меня новая проблема, в моей исходной таблице больше столбцов (PaymentID, RefPayment, Value, ..), как я могу получить значения этих столбцов в вашем запросе? – Ricky

+0

@Ricky Вы можете добавить еще столбец в разделе «group by», как эта 'группа p, с помощью нового {p.CompanyID, p.OtherColumn, p.Another}', а затем добавить его в предложение 'select', обратившись к нему из ' Key ', как этот 'op.Key.CompanyID'. – Gilang

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