Puis-je déclarer / utiliser une variable dans LINQ? Ou puis-je écrire après LINQ plus clair?

Puis-je déclarer / utiliser des variables dans LINQ ?

Par exemple, puis-je écrire après LINQ clearer?

var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance) where (t.ComponentType.GetProperty(t.Name) != null) select t.ComponentType.GetProperty(t.Name); 

Y a-t-il des façons de ne pas écrire / appeler t.ComponentType.GetProperty(t.Name) deux fois ici?

 var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance) let u = t.ComponentType.GetProperty(t.Name) where (u != null) select u; 

Vous devez let :

 var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance) let name = t.ComponentType.GetProperty(t.Name) where (name != null) select name; 

Si vous vouliez le faire dans une syntaxe de requête, vous pourriez le faire d’une manière plus efficace et plus propre:

 var q = TypeDescriptor .GetProperties(instance) .Select(t => t.ComponentType.GetProperty(t.Name)) .Where(name => name != null); 

Oui, en utilisant le mot let clé let :

 var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance) let nameProperty = t.ComponentType.GetProperty(t.Name) where (nameProperty != null) select nameProperty; 

Il y a une alternative que peu de gens connaissent ( select a into b ):

 var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance) select t.ComponentType.GetProperty(t.Name) into u where u != null select u; 

Cela se traduit par:

 var q = TypeDescriptor.GetProperties(instance) .Select(t => t.ComponentType.GetProperty(t.Name)) .Where(prop => prop != null); 

Considérant que la version basée sur let traduit par:

 var q = TypeDescriptor.GetProperties(instance) .Select(t => new { t, prop = t.ComponentType.GetProperty(t.Name) }) .Where(x => x.prop != null) .Select(x => x.prop); 

Une allocation inutile par article car t est toujours dans le champ d’application (pas encore utilisé). Le compilateur C # devrait simplement optimiser cela, mais ce n’est pas le cas (ou la spécification du langage ne le permet pas, pas sûr).