C# 排序在实体框架查询中不起作用

C# 排序在实体框架查询中不起作用,c#,linq,entity-framework,C#,Linq,Entity Framework,我目前正在使用实体框架(6.1.3)为我的应用程序进行linq查询 查询如下: var productPeriods = (from pp in ctx.ProductPeriods where pp.IsActive && pp.Product.IsBuyBackForProduct == null && !pp.Product.ProductAddOns.Any() &am

我目前正在使用实体框架(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())
}
但似乎
然后降序(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 bestPriceOfToday = period.Prices.OrderByDescending(x => x.ProductPrice).FirstOrDefault()

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

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

select new {
    ProductPeriod = p,  
    Price = p.Prices.GroupBy(x => x.FirmID).Select(pr => pr.OrderByDescending(x => x.Created).ThenByDescending(x => x.ProductPrice).FirstOrDefault())
}
  • OrderBy或OrderByDescending
  • 然后,还是接着下降

ThenBy语句可以使用1次或多次,它们只需向结果查询中添加额外的order语句。

根据您的更新,omnit
选择并键入:

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

select
无效,可能是问题的原因

是否有任何异常?排序和分组不会保留顺序,尤其是在您排序时。查看
ThenByDescending()
执行第二个顺序没有引发异常,但结果不正确:-)我一定会查看ThenByDescending调用。谢谢!顺便说一句,我刚读到这是实体框架中的一个bug,有人能证实这一点吗?数据类型是什么?是否创建了日期时间?是的,“Created”是日期时间,“ProductPrice”是小数:-),您需要将创建的orderby移动到刚好高于ProductPrice的位置(使用thenby)。组之前的ORDERBY不清楚-在SQL中,将ORDERBY放在分组之后。它可能仍然有效,但除非它们并置,否则不明显需要使用thenby。group by可以在linq中的orderby(到目前为止还没有尝试)之前使用,因为语句本身仅在需要时运行,因此在本例中是在生成ToList()时运行的。在此之前,查询不会执行,因此不会有问题(但正如我所说,如果groupby/orderby的顺序在ToList之前是否重要,请不要尝试)Hi@michasm,感谢您的输入:-)我不认为选择是没有用的,因为我从按公司ID对价格进行分组开始。如果我跳过选择,由于集合现在是一个分组,而不是一个价格集合,因此我无法按创建的顺序订购。有道理吗?:-)嗯,对了@BoMortensen它在一个小组里,现在对我来说似乎是合法的:)