query into linq entity-framework c#-4.0 lambda let

linq - into - ¿Cómo "dejar" en expresión lambda?



let linq query (3)

¿Cómo puedo volver a escribir esta consulta de linq en Entity on con la expresión lambda?
Quiero usar let palabra clave o un equivalente en mi expresión lambda.

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

Para algunas preguntas similares, como lo que se comenta en mi pregunta, se sugiere

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

que calculará AveragePrice para cada artículo, mientras que en el estilo de consulta que mencioné, let expression impide calcular el promedio muchas veces.


Básicamente, debe usar Seleccionar y un tipo anónimo para agregar el promedio a su objeto, seguido del resto de su extracto.

No probado, pero debería verse así:

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

Advertencia, ten cuidado con estos constructos. Usar let crea un nuevo tipo anónimo por objeto en su colección, consume mucha memoria con grandes colecciones ...

Mire aquí para más detalles: permita que los métodos de extensión encadenados


Otra opción es definir este método de extensión:

public static class Functional { public static TResult Pipe<T, TResult>(this T value, Func<T, TResult> func) { return func(value); } }

Luego escribe tu consulta así:

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


Por lo tanto, puede usar la sintaxis del método de extensión, que implicaría una expresión lambda más de lo que está utilizando actualmente. No hay let , solo usa una lambda multilínea y declara una variable:

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

Tenga en cuenta que modifiqué la comparación de precios promedio, porque la suya nunca arrojaría ningún resultado (más de 500 Y menos de 250).

La alternativa es

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