在选择使用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
属性的问题的示例中,这不是查询表达式翻译的问题-这是Select
和Where
方法如何处理它们作为参数的委托或表达式树。有时在过滤之前做一个投影是有意义的,有时没有。
至于小规则,我只有一个:使用最易读的查询方式。因此,如果查询发生变化,并且"哪种形式更可读"同时发生变化,则更改所使用的语法。
如果你打算使用LINQ,你应该对任何一种语法都很满意,至少要阅读。
我倾向于发现具有多个范围变量的查询(例如通过SelectMany
或Join
,或let
子句)最终使用查询表达式更具可读性-但这远非硬性规则。