LINQ - 查询语法与方法链和lambda



在选择使用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属性吗?我们是否可以这样做并潜在地提高性能?这是否意味着在性能方面更容易控制?

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扩展方法,在我看来,用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查询。

还有谁能补充一下吗?每个人都有自己的小规则吗?还是他们的公司建议/强制使用?

回答您关于翻译的问题,查询表达式将始终根据c# 4规范(或c# 3规范中的等效规则)7.16的规则进行翻译。在您询问有关Name属性的问题的示例中,这不是查询表达式翻译的问题-这是SelectWhere方法如何处理它们作为参数的委托或表达式树。有时在过滤之前做一个投影是有意义的,有时没有。

至于小规则,我只有一个:使用最易读的查询方式。因此,如果查询发生变化,并且"哪种形式更可读"同时发生变化,则更改所使用的语法。

如果你打算使用LINQ,你应该对任何一种语法都很满意,至少要阅读。

倾向于发现具有多个范围变量的查询(例如通过SelectManyJoin,或let子句)最终使用查询表达式更具可读性-但这远非硬性规则。

相关内容

  • 没有找到相关文章

最新更新