2010-08-20 6 views
2

Je sais que les expressions lambda dans les boucles peuvent causer des problèmes si elles utilisent des variables locales. (Voir http://www.jaylee.org/post/2008/11/18/Lambda-Expression-and-ForEach-loops.aspx)Expression C# lambda dans la requête LINQ

Maintenant, j'ai une situation où je me sers d'une expression lambda dans une requête LINQ:

var products = from product in allProducts 
       select new 
       { 
        ID = product.ID, 
        Name = product.Name, 
        Content = new Func<object,string>(
        (obj) => (GetSomeDynamicContent(obj, product)) 
        ) 
       }; 

someCustomWebControl.DataSource = products; 
someCustomWebControl.DataBind(); 

Est-ce sans danger? Est-ce que le compilateur étendra toujours correctement cette expression et s'assurera que "product" pointe vers l'objet correct?

Répondre

2

Oui, c'est sécuritaire à faire. Votre requête LINQ se développe essentiellement à ceci:

private AnonType AnonMethod(Product product) 
{ 
    return new 
     { 
      ID = product.ID, 
      Name = product.Name, 
      Content = new Func<object,string>(
       (obj) => (GetSomeDynamicContent(obj, product)) 
       ) 
     }; 
} 

var products = allProducts.Select(AnonMethod); 
someCustomWebControl.DataSource = products; 
someCustomWebControl.DataBind(); 

Comme vous pouvez le voir, l'expression lambda capture la variable product pour chaque produit dans allProducts.

Questions connexes