2015-04-29 4 views
0

Я в настоящее время борется запрос Linq для моего приложения с помощью Entity Framework (6.1.3)заказа не работает в Entity Framework запроса

запрос является следующим:

var productPeriods = (from pp in ctx.ProductPeriods           
    where pp.IsActive && pp.Product.IsBuyBackForProduct == null && !pp.Product.ProductAddOns.Any() && pp.PowerRegionID == powerRegionId 
    select new 
    { 
     ProductPeriod = pp, 
     Price = pp.Prices 
     .OrderByDescending(x => x.Created) 
     .GroupBy(x => x.FirmID) 
     .Select(pr => pr.FirstOrDefault()) 
     .OrderByDescending(x => x.ProductPrice) 
     .FirstOrDefault() 
    }).ToList(); 

Цель этого запрос заключается в том, чтобы найти самую последнюю цену из коллекции цен периода продукта, сгруппированную по идентификатору фирмы, а затем выбрать лучшую цену последних цен от каждой фирмы.

Это прекрасно работает в Linqpad, но первый OrderByDescending(x => x.Created) не работает при использовании в контексте Entity Framework.

Кто-нибудь знает почему? И, возможно, есть решение для этого? :-)

Заранее благодарен!

Update

Спасибо за все ответы. Я попробовал следующее:

select new { 
    ProductPeriod = p, 
    Price = p.Prices.GroupBy(x => x.FirmID).Select(pr => pr.OrderByDescending(x => x.Created).ThenByDescending(x => x.ProductPrice).FirstOrDefault()) 
} 

Но, похоже, ThenByDescending(x => x.ProductPrice) игнорируется, а также. Цены не сортируются правильно на выходе. Они выход, как это:

Price: 0,22940, Created: 06-03-2015 10:15:09, 
Price: 0,23150, Created: 06-03-2015 10:05:48 
Price: 0,20040, Created: 06-03-2015 09:24:24 

Update 2 (решение на данный момент)

я пришел к решению, что первоначальный запрос возвращает только последние цены от каждой фирмы. В настоящее время существует три фирмы, поэтому производительность должна быть в порядке.

Позже в моем коде, где я на самом деле использую самую последнюю и лучшую цену, я просто делаю .OrderByDescending(x => x.ProductPrice).FirstOrDefault() и проверяю, не является ли оно нулевым.

т.е:

var productPeriods = (from pp in ctx.ProductPeriods 
         where pp.IsActive && pp.Product.IsBuyBackForProduct == null && !pp.Product.ProductAddOns.Any() && pp.PowerRegionID == powerRegionId 
         select new 
         { 
          ProductPeriod = pp, 
          Prices = pp.Prices.GroupBy(x => x.FirmID).Select(pr => pr.OrderByDescending(x => x.Created).FirstOrDefault()) 
         }).ToList(); 

Позже в моем коде:

var bestPriceOfToday = period.Prices.OrderByDescending(x => x.ProductPrice).FirstOrDefault() 
+0

Есть ли исключения? – haim770

+1

заказ, а затем группировка не сохранит заказ, особенно если вы переупорядочиваете. загляните в 'ThenByDescending()', чтобы сделать второй заказ – DLeh

+0

Исключение не выбрасывается, но результаты неверны :-) Я обязательно посмотрю на вызов ThenByDescending. Большое спасибо! На стороне записки, я только что прочитал, что это ошибка в структуре сущности, может ли кто-нибудь подтвердить это? –

ответ

0

Проблема заключается в том, что команды, которые вы используете. OrderBy и OrderByDescending НЕ добавляют дополнительный порядок инструкциями к результирующему запросу, но вместо этого они СОЗДАВАЮТ инструкцию order by и устраняют все инструкции orderby, которые существовали ранее.

Для того, чтобы использовать несколько OrderBy Вам необходимо сделать следующее:

  • OrderBy или OrderByDescending
  • ThenBy или ThenByDescending

заявления ThenBy можно использовать 1 или более раз они просто добавьте в запрос запрос дополнительных заказов.

+0

И вам нужно будет переместить созданный orderby чуть выше ProductPrice (с учетом этого). Порядок перед группой не ясен - в SQL вы кладете orderbys после группировок. Это может по-прежнему работать, но не очевидно, что вам нужно использовать то, если они не сопоставлены. – Todd

+0

группа COULD будет использоваться до orderby (пока не пыталась выполнить) в linq. BECAUSE сама инструкция запускается только тогда, когда это необходимо, поэтому в этом случае, когда делается ToList(). до тех пор запрос не выполняется, поэтому это не должно быть проблемой (но, как я уже сказал, не пробовал, если порядок groupby/orderby важен до ToList или нет) – Thomas

0

По обновлению Yours, omnit select и тип:

select new { 
    ProductPeriod = p, 
    Price = p.Prices.GroupBy(x => x.FirmID) 
     .OrderByDescending(x =>x.Created).ThenByDescending(x=>x.ProductPrice).FirstOrDefault() 
} 

Это select было бесполезно, и может быть причиной проблемы

+0

Привет @michasm, спасибо за ввод: -) Я не думаю, что выбор был бесполезным, так как я начинаю с группировки цен по идентификатору фирмы. Если я пропущу выбор, я не могу заказать его, создав, так как коллекция теперь представляет собой группу, а не коллекцию цены. Имеет смысл? :-) –

+0

mmm, right @BoMortensen это в группе, теперь мне кажется законным :) – michalczukm

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