考虑这个linq:
list.Where(sil => sil.XML.Element("ticket") != null && sil.XML.Element("ticket").Attribute("id").Value == smsRequestIn.TicketID)
如果“ticket”元素不为null,则它会搜索两次,因此不是很有效。有没有办法在linq表达式中使用某种变量,所以我可以引用变量而不是对“ticket”元素进行双重搜索,或者linq是否足够智能而不能进行双重搜索?
答案 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);
但在这种情况下,我认为你真正受益于使用查询语法,就像其他答案所建议的那样。它更清楚。