Search code examples
linqentity-frameworkc#-4.0lambdalet

How to "let" in lambda expression?


How can I rewrite this linq query to Entity on with lambda expression?
I want to use let keyword or an equivalent in my lambda expression.

var results = from store in Stores
              let AveragePrice =  store.Sales.Average(s => s.Price)
              where AveragePrice < 500 && AveragePrice > 250

For some similar questions like what is commented under my question, it's suggested to

.Select(store=> new { AveragePrice = store.Sales.Average(s => s.Price), store})

which will calculate AveragePrice for each item, while in Query style I mentioned, let expression prevents to calculate average many times.


Solution

  • So, you can use the extension method syntax, which would involve one lambda expression more than you are currently using. There is no let, you just use a multi-line lambda and declare a variable:

    var results = Stores.Where(store => 
    {
        var averagePrice = store.Sales.Average(s => s.Price);
        return averagePrice > 250 && averagePrice < 500;
    });
    

    Note that I changed the average price comparison, because yours would never return any results (more than 500 AND less that 250).

    The alternative is

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