在linq查询中使用变量

时间:2010-04-13 16:06:16

标签: linq .net-3.5

考虑这个linq:

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

如果“ticket”元素不为null,则它会搜索两次,因此不是很有效。有没有办法在linq表达式中使用某种变量,所以我可以引用变量而不是对“ticket”元素进行双重搜索,或者linq是否足够智能而不能进行双重搜索?

3 个答案:

答案 0 :(得分:5)

在LINQ表达式语法中,您可以使用let,如下所示:

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

要使用扩展方法复制let,您需要使用Select和匿名类型

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);

其中不太清楚。

答案 1 :(得分:3)

我会将您的查询重写为以下内容:

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

答案 2 :(得分:0)

您可以这样做:

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

list.Where(filter);

但在这种情况下,我认为你真正受益于使用查询语法,就像其他答案所建议的那样。它更清楚。