订购不在Entity Framework查询中

时间:2015-04-29 13:13:41

标签: c# linq entity-framework

我目前正在使用Entity Framework(6.1.3)与我的应用程序进行linq查询

查询如下:

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();

查询的目的是从产品期间的价格集中查找最新价格,按公司ID分组,然后从每家公司中选择最新价格的最佳价格。

这在Linqpad中非常有效,但在实体框架的上下文中使用时,第一个OrderByDescending(x => x.Created)不起作用。

有谁知道为什么?也许有一个解决方案呢? : - )

提前致谢!

更新

感谢所有回复。我尝试过以下方法:

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

更新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()

2 个答案:

答案 0 :(得分:0)

问题是您正在使用的命令。 OrderBy和OrderByDescending不会向结果查询添加额外的order by语句,而是创建order by语句并删除之前存在的所有orderby语句。

要使用多个orderby,您需要执行以下操作:

  • OrderBy或OrderByDescending
  • ThenBy或ThenByDescending

ThenBy语句可以使用1次或更多次,只需在生成的查询中添加其他订单语句。

答案 1 :(得分:0)

根据您的更新,omnit select并输入:

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

select没用,可能是问题的原因