LINQ - 查询语法与方法链&拉姆达

时间:2011-11-07 14:16:34

标签: c# .net linq lambda linq-query-syntax

当选择在其中一个LINQ扩展方法中使用LINQ查询语法或Lambda表达式时,是否有人遵守任何规则(或者您是否被迫遵守雇主的任何规则?)?这适用于任何实体,SQL,对象,任何内容。

在我们的工作场所,我的老板根本不喜欢lambda,他会使用查询语法来处理任何事情,在某些情况下,我发现它的可读性较差。

var names = collection.Select(item => item.Name);

var names = from item in collection
            select item.Name;

也许在添加条件时,我发现的Lambda有点乱,

var names = collection.Where(item => item.Name == "Fred")
                      .Select(item => item.Name);

var names = from item in collection
            where item.Name == "Fred"
            select item.Name;

只是出于兴趣:编译器如何对待这个?有谁知道上面的LINQ查询将如何编译成lambda?是否会为每个元素调用Name属性?我们可以这样做,并可能提高性能吗?这是否意味着lambda在性能方面稍微可控?

var names = collection.Select(item => item.Name)
                      .Where(name => name == "Fred");

当然,当我们开始使用越来越多的表达式时,lambda变得凌乱,我开始在这里使用查询语法。

var names = collection.Where(item => item.Name == "Fred")
                      .OrderBy(item => item.Age)
                      .Select(item => item.Name);

var names = from item in collection
            where item.Name == "Fred"
            order by item.Age
            select item.Name;

我发现还有一些使用查询语法无法完成的事情。其中一些你认为非常简单(特别是聚合函数),但不是,你必须在最后添加一个LINQ扩展方法,imo,看起来更整洁的lambda表达式。

var names = collection.Count(item => item.Name == "Fred");

var names = (from item in collection
            where item.Name == "Fred"
            select item).Count()

即使对于一些简单的lambda链,ReSharper也建议我将它们转换为LINQ查询。

其他人可以添加吗?有没有人有他们自己的小规则或他们的公司建议/强制使用一个?

1 个答案:

答案 0 :(得分:35)

要回答有关翻译的问题,查询表达式将始终根据C#4规范7.16(或C#3规范中的等效规则)的规则进行翻译。在您询问有关Name属性的问题的示例中,这不是查询表达式转换的问题 - 它是SelectWhere方法对委托或表达式的作用他们把树作为参数。有时在过滤之前进行投影是有意义的,有时则不然。

至于小规则,我只有一个:使用对于查询中最可读的方式。因此,如果查询更改并且“哪个表单更具可读性”同时更改,请更改使用的语法。

如果您打算使用LINQ,那么 应该对这两种语法感到满意,至少要阅读。

倾向于发现具有多个范围变量的查询(例如,通过SelectManyJoinlet子句)最终使用更具可读性查询表达式 - 但这远不是一个严格的规则。