我有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())
答案 0 :(得分:3)
达林说,没有区别。就个人而言,我更喜欢第一种语法,因为你所拥有的只是查询表达式中的单个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();
但是编译器会删除no-op Select(x => x)
。在没有其他条款的情况下, 不执行此操作 - 因此from x in y select x
仍然成为y.Select(x => x)
。
答案 1 :(得分:2)
完全没有区别。编译器将第二种语法转换为第一种语法(在编译的程序集中使用Reflector查找),因此您可以自行决定哪种语法最适合您。
答案 2 :(得分:0)
对我来说也一样。唯一的区别是第一个是用lambda表达式写的,第二个用linq写成xml。