En este caso particular, se traduce a:
list.Select(x => SomeComplexExpressionDependingOnx);
Pero puede haber un caso más complejo, como por ejemplo:
from x in list
let v = SomeComplexExpressionDependingOnx
where v > 10 && v+5 < 50 && SomeFunc(v) == "str"
select x
se traducirá en:
list.Where(x =>
{
var v = SomeComplexExpressionDependingOnx;
return v > 10 && v+5 < 50 && SomeFunc(v) == "str";
}
)
En otras palabras, la palabra clave let
es una forma de minimizar y/u optimizar su consulta. Es decir, sin la palabra clave let
que tendría que escribir:
from x in list
where
SomeComplexExpressionDependingOnx > 10 &&
SomeComplexExpressionDependingOnx+5 < 50 &&
SomFunc(SomeComplexExpressionDependingOnx) == "str"
select x
resultando en una posible evaluación de triple de la misma expresión.
Actualización, a raíz de una pregunta en el comentario.
Primero, ¿qué tiene de atemorizante "expresiones de bloque"? Son solo una abreviatura de delegado arbitrario. Es decir, la siguiente expresión:
Func<string,int> f =
s =>
{
var ln = s.Length;
return ln/2;
}
es equivalente a lo siguiente:
int CompilerGeneratedMethodIdentifier0(string s)
{
var ln = s.Length;
return ln/2;
}
...
Func<string, int> f = new Func<string, int>(CompilerGeneratedMethodIdentifier0);
Segunda, lo que es tan especial sobre las expresiones "bloquear"? ¿Sabías que mmm ...llamémosles "sin bloque" ¿las expresiones también se expanden al mismo código? Es decir, el código simple new Func<string,int>(s => s.Length/2)
es equivalente a absoluta:
int CompilerGeneratedMethodIdentifier0(string s)
{
return s.Length/2;
}
...
new Func<string, int>(CompilerGeneratedMethodIdentifier0);
Tercer, lo que es tan no linqy sobre las expresiones "bloquear"? LINQ usa delegados por todas partes, y realmente no le importa a LINQ qué atajo exacto utilizas para representar a esos delegados.
En particular, su expresión from a in list where a.SomeProp > 10 select new { A = a, B = a.GetB() }
se traduce en lo siguiente:
class AnonymousType0
{
public MyClass A { get; set; }
public othertype B { get; set; }
}
bool WhereFunc0(MyClass a)
{
return a.SomeProp > 10;
}
AnonymousType0 SelectResultFunc0(MyClass a)
{
AnonymousType0 result = new AnonymousType0();
result.A = a;
result.B = a.GetB();
return result;
}
...
list
.Where(new Func<MyClass,bool>(WhereFunc0))
.Select(new Func<MyClass,AnonymousType0>(SelectResultFunc0));
Cuarta, para obtener la comprensión de esta manera, uno puede jugar con el lenguaje y pensar. Usa tu cerebro, eso es.
Y quinto, si el consejo anterior no funciona para usted por una razón u otra, siempre tiene ILSpy. Herramienta muy útil, todo el mundo debería tener una.
+1 como no había usado antes. Informativo. – Kelsey