我目前正在使用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()
答案 0 :(得分:0)
问题是您正在使用的命令。 OrderBy和OrderByDescending不会向结果查询添加额外的order by语句,而是创建order by语句并删除之前存在的所有orderby语句。
要使用多个orderby,您需要执行以下操作:
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
没用,可能是问题的原因