2010-04-13 4 views
1

prendre cette LINQ en considération:variable d'utilisation dans une requête LINQ

list.Where(sil => sil.XML.Element("ticket") != null && sil.XML.Element("ticket").Attribute("id").Value == smsRequestIn.TicketID) 

si l'élément « ticket » est non nulle il recherche deux fois et est donc pas très efficace. Existe-t-il un moyen d'utiliser une sorte de variable dans l'expression linq pour que je puisse référencer la variable au lieu d'effectuer une double recherche de l'élément "ticket" ou est assez intelligent pour ne pas effectuer une double recherche?

Répondre

5

Dans LINQ syntaxe d'expression que vous souhaitez utiliser let comme ceci:

from sil in list 
let ticket = sil.XML.Element("ticket") 
where ticket != null && ticket.Attribute("id").Value == smsRequestIn.TicketID 
select sil; 

Pour répliquer let en utilisant des méthodes d'extension, vous devez utiliser Select et un type anonyme comme si

list.Select(anon => new { ticket = anon.XML.Element("ticket"), anon }) 
    .Where(sil => sil.ticket != null && sil.ticket.Attribute("id").Value == smsRequestIn.TicketID) 
    .Select(o=>o.anon); 

qui est beaucoup moins clair.

+0

+1 et accepté pour fournir les deux versions. J'ai décidé d'utiliser la syntaxe d'expression LINQ pour des raisons de clarté –

3

Je réécris votre requête à ce qui suit:

var result = from sil in list 
      let element = sil.XML.Element("ticket") 
      where element != null && 
        element.Attribute("id").Value == smsRequestIn.TicketID 
      select sil; 
0

Vous pouvez faire quelque chose comme ceci:

Func<SilClass,bool> filter = sil => 
{ 
    XElement e = sil.XML.Element("ticket"); 
    return e != null && e.Attribute("id").Value == smsRequestIn.TicketID); 
}; 

list.Where(filter); 

mais dans ce cas, je pense que vous bénéficiez vraiment en utilisant la syntaxe de requête comme les autres réponses ont suggéré. C'est beaucoup plus clair.

Questions connexes