在linq查询中使用变量

Jon*_*ski 1 linq .net-3.5

考虑这个linq:

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

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

Jas*_*yon 5

在LINQ表达式语法中,您可以这样使用let:

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

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);
Run Code Online (Sandbox Code Playgroud)

哪个不太清楚.