这两个XML LINQ查询有什么区别?

时间:2010-03-08 10:43:51

标签: c# linq .net-3.5 linq-to-xml

我有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())

3 个答案:

答案 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。