Rez*_*aei 40 linq lambda entity-framework let c#-4.0
如何使用lambda表达式将此linq查询重写为Entity on?
我想在我的lambda表达式中使用let关键字或等效项.
var results = from store in Stores
let AveragePrice = store.Sales.Average(s => s.Price)
where AveragePrice < 500 && AveragePrice > 250
Run Code Online (Sandbox Code Playgroud)
对于一些类似的问题,比如我的问题所评论的内容,建议使用
.Select(store=> new { AveragePrice = store.Sales.Average(s => s.Price), store})
Run Code Online (Sandbox Code Playgroud)
这将计算每个项目的AveragePrice,而在我提到的查询样式中,让表达式阻止多次计算平均值.
Jay*_*Jay 46
因此,您可以使用扩展方法语法,这将涉及比您当前使用的更多lambda表达式.没有let,你只需使用多行lambda并声明一个变量:
var results = Stores.Where(store =>
{
var averagePrice = store.Sales.Average(s => s.Price);
return averagePrice > 250 && averagePrice < 500;
});
Run Code Online (Sandbox Code Playgroud)
请注意,我更改了平均价格比较,因为您的结果不会返回任何结果(超过500且低于250).
替代方案是
var results = Stores.Select(store => new { Store = store, AveragePrice = store.Sales.Average(s => s.Price})
.Where(x => x.AveragePrice > 250 && x.AveragePrice < 500)
.Select(x => x.Store);
Run Code Online (Sandbox Code Playgroud)
Yoe*_*eri 24
基本上,您需要使用Select和匿名类型来向对象添加平均值,然后是语句的其余部分.
没有测试,但它应该是这样的:
Stores.Select(
x => new { averagePrice = x.Sales.Average(s => s.Price), store = x})
.Where(y => y.averagePrice > 500 && y.averagePrice < 250)
.Select(x => x.store);
Run Code Online (Sandbox Code Playgroud)
警告,请注意这些结构.使用let在集合中为每个对象创建一个新的匿名类型,它会占用大量集合的大量内存...
在这里查看详细信息: 让链接扩展方法
| 归档时间: |
|
| 查看次数: |
28739 次 |
| 最近记录: |