【问题标题】:What is the difference between these 2 XML LINQ Queries?这两个 XML LINQ 查询有什么区别?
【发布时间】:2010-03-08 10:43:50
【问题描述】:
我有以下 2 个 LINQ 查询,但我对 LINQ 不太了解,那么以下两种方法有什么区别?
是否存在一种方法优于另一种方法的情况?
ChequeDocument.Descendants("ERRORS").Where(x=>(string)x.Attribute("D") == "").Count();
(from x in ChequeDocument.Descendants("ERRORS") where
(string)x.Attribute("D") == ""
select x).Count())
【问题讨论】:
标签:
c#
linq
.net-3.5
linq-to-xml
【解决方案1】:
正如达林所说,没有区别。就我个人而言,我更喜欢第一种语法,因为您所拥有的只是查询表达式中的一个 where 子句。请注意,第一种语法更具可读性:
var query = ChequeDocument.Descendants("ERRORS")
.Where(x=>(string)x.Attribute("D") == "")
.Count();
另请注意,这是演示查询表达式的一种特殊情况。第二种语法最初翻译成:
var query = ChequeDocument.Descendants("ERRORS")
.Where(x=>(string)x.Attribute("D") == "")
.Select(x => x)
.Count();
但编译器删除了无操作Select(x => x)。它不会在没有其他子句的情况下这样做 - 所以from x in y select x 仍然变为y.Select(x => x)。
【解决方案2】:
根本没有区别。编译器将第二种语法转换为第一种(使用 Reflector 查看编译后的程序集),因此您可以自行决定哪种语法最适合您。
【解决方案3】:
对我来说也是一样。唯一的区别是第一个是用 lambda 表达式写的,第二个是用 linq to xml 写的。