Después de leer "Odd query expressions" de Jon Skeet, probé el siguiente código. Yo esperaba que la consulta LINQ al final de traducir a int query = proxy.Where(x => x).Select(x => x);
cuales no se compila porque Where
devuelve un int
. El código se compila e imprime "Where (x => x)" en la pantalla y la consulta se establece en 2. No se llama a Select nunca, pero debe estar allí para que el código se compile. ¿Que esta pasando?¿Por qué compila esta consulta LINQ?
using System;
using System.Linq.Expressions;
public class LinqProxy
{
public Func<Expression<Func<string,string>>,int> Select { get; set; }
public Func<Expression<Func<string,string>>,int> Where { get; set; }
}
class Test
{
static void Main()
{
LinqProxy proxy = new LinqProxy();
proxy.Select = exp =>
{
Console.WriteLine("Select({0})", exp);
return 1;
};
proxy.Where = exp =>
{
Console.WriteLine("Where({0})", exp);
return 2;
};
int query = from x in proxy
where x
select x;
}
}
Consulte también http://blogs.msdn.com/b/ericlippert/archive/2008/05/12/trivial-projections-are-usually-optimized-away.aspx para obtener algunas ideas adicionales sobre esta función. –