如何在lambda表达式中"让"?

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)

  • 错误:带有语句主体的lambda表达式无法转换为表达式树. (6认同)
  • 您的第一个提议只适用于内存,不能用于像EF这样的LINQ提供程序.具有语句主体的lambda表达式无法转换为表达式树. (5认同)
  • @amkh:我几乎肯定在问题的第一个版本中没有提到EF.或者至少杰伊和我都没有注意到...... (2认同)
  • @Reza不,我不认为它必然会提高EF查询性能.答案就是如何使用扩展方法语法进行`let`-like操作.为什么不坚持使用查询语法呢? (2认同)

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在集合中为每个对象创建一个新的匿名类型,它会占用大量集合的大量内存...

在这里查看详细信息: 让链接扩展方法

  • 这应该是公认的答案,因为它允许您在不同的"子句"中使用变量. (3认同)
  • 实际上,它只适用于linq到物体.谢谢 (2认同)