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