Самый эффективный способ получить МАКСИМАЛЬНОЕ значение объединенной таблицы в запросе LINQ с использованием C#

#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 комбинации.