Arhn - архитектура программирования

Запросы Entity Framework с максимальным

Кто-то просит меня преобразовать оператор T-SQL в запрос LINQ to EF:

SELECT * FROM  CopperPrices  
where ID in 
  (select max(ID) as ID from copperprices group by market, pname)

Я использую общие идеи LINQ-TO-OBJECT и даю следующий ответ:

class CopperPrice
{
    public int ID { get; set; }
    public string Market { get; set; }
    public string PName { get; set; }
}

var result = from p in copperPrices
      group p by new { Market = p.Market, PName = p.PName } into g
      select g.OrderByDescending(p => p.ID).First();

Но он не работает в EF из-за следующего исключения:

Метод «Первый» можно использовать только как окончательную операцию запроса. Рассмотрите возможность использования метода «FirstOrDefault» в этом экземпляре вместо этого.

Можно ли преобразовать приведенный выше оператор T-SQL в один оператор запроса LINQ?

18.07.2012

  • Что произойдет, если вы сделаете так, как предлагает сообщение об ошибке? FirstOrDefault должен давать те же результаты, что и First, если вы знаете, что у вас есть непустой набор, поэтому, если FirstOrDefault принимается EF, а First нет, используйте FirstOrDefault. 18.07.2012

Ответы:


1

Ну вот:

var result1 = copperPrices.GroupBy(g => new { g.Market, g.PName }).Select
     (
         x => x.ToList().OrderByDescending(z => z.ID).FirstOrDefault()
     );

Важной частью здесь является .Select(x => x.ToList()). ToList возвращает значения IGrouping, каждое из которых является тем, что вы в конечном итоге хотите заказать и выбрать максимальное количество.

18.07.2012
  • Мой оператор linq, очевидно, может вернуть несколько элементов. 18.07.2012
  • Ваши два запроса, если они вообще могут выполняться, возвращают одно значение. 18.07.2012
  • @hvd они запускаются и возвращают идентичные результаты. Правда, они возвращают одно значение, но это значение представляет собой группу, которую можно перечислить. Внутри группы находятся все CopperPrices с максимальным ID. 18.07.2012
  • @hvd ты прав. Я запутался... но я считаю, что теперь у меня есть правильное решение! :) Я обновил ответ выше 19.07.2012
  • Если честно, все правки больше похожи на игру в угадайку, чем на ответ. И я сомневаюсь, что LINQ to Entities примет ToList() внутри проекции. Вы проверили это? 19.07.2012
  • Мой комментарий к предыдущей версии вашего ответа был неправильным, кстати, я его удалил. 19.07.2012
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..