#c# #linq #linq-to-sql #c#-4.0
#c# #linq #linq-to-sql #c #-4.0
Вопрос:
Я пытаюсь найти наиболее эффективный способ получить самую последнюю запись в объединенной таблице в LINQ.
Этот запрос может обрабатывать тысячи записей, поэтому я не хотел выполнять подзапрос.
Мне нужно все из элементов, но только самую последнюю дату из таблицы «Примечания», имя поля которой — SubmittedDate.
var items = (from t1 in db.Items
from t2
in db.Notes
.Where(o => (t1.Item_ID == o.Item_ID))
select new ItemModel
{
Name = t1.Name,
MostRecentUpdate = t2.SubmittedDate <== Need max value in model
});
Любая помощь была бы высоко оценена.
Ответ №1:
Похоже, вы, вероятно, просто хотите объединить группу:
var items = from t1 in db.Items
join t2 in db.Notes on t1.Item_ID equals t2.Item_ID into notes
select new ItemModel
{
Name = t1.Name,
MostRecentUpdate = notes.Max(x => (DateTime?) x.SubmittedDate)
};
Теперь MostRecentUpdate
должно быть null, если в совпадающих Notes
строках нет ненулевых дат. По крайней мере, таково было бы поведение LINQ to Objects, так что скрестив пальцы, сохраняем абстракцию…
Комментарии:
1. Спасибо, Джон. Вернет ли это значение null, если в таблице notes не найдено элементов?
2. @Nick: Я могу это сделать — я об этом не подумал 🙂
3. Спасибо за быстрый ответ. Вы не возражаете? Я учусь! 🙂
4. Разве вам не нужно
let
здесь? Другими словами, не является ли ваш запрос повторным выдачейMax
подзапроса для каждого элемента?5. @BrokenGlass: Нет,
notes
это группа, специфичная для текущейt1
, поскольку это групповое объединение. Для каждогоt1
результата есть только один результат, а не один дляt1
/t2
комбинации.