Mar*_*ini 57 linq lambda .net-3.5
我开始一般使用LINQ(到目前为止使用XML和toSQL).我已经看到有时候有两种或更多种方法可以达到相同的效果.拿这个简单的例子,据我所知,两者都返回完全相同的东西:
SomeDataContext dc = new SomeDataContext();
var queue = from q in dc.SomeTable
where q.SomeDate <= DateTime.Now && q.Locked != true
orderby (q.Priority, q.TimeCreated)
select q;
var queue2 = dc.SomeTable
.Where( q => q.SomeDate <= DateTime.Now && q.Locked != true )
.OrderBy(q => q.Priority)
.ThenBy(q => q.TimeCreated);
Run Code Online (Sandbox Code Playgroud)
除了我在语法中可能犯的任何错误或缺少参数或差异之外,我们的想法是有两种表达同一事物的方法; 我知道第一种方法有一些局限性,"点符号"更完整,但除此之外,还有其他优点吗?
and*_*eer 54
"点"表示法通常称为Lambda语法.第一种表示法有许多名称,但我通常将其称为查询语法.
我在一个由10名开发人员组成的团队中工作,我们详细讨论了我们应该将其作为标准使用的问题.一般来说,经验丰富的(使用LINQ)开发人员迁移到Lambda语法,但有一些重要的例外.
Lambda更简洁,但执行多个表连接是一场噩梦.使用查询语法,联接更加清晰.另一方面,有许多LINQ操作只存在于Lambda语法中:Single(),First(),Count()等.
因此,使用您感觉最舒服的东西,并意识到当您获得经验时,您的偏好可能会改变.能够阅读两者都很有价值,肯定会出现两种情况都需要使用的情况.其他情况会使一种风格超过另一种风格.最后,它们都被翻译成相同的可执行代码.
Jon*_*eet 28
我根据具体情况使用哪种语法对我的查询更具可读性.
在可能的情况下,我尽量避免混合和匹配两者,尽管有时它是可以的(例如,如果它是First()
在查询结束时的单个调用).延迟执行意味着它是一样有效的是使用查询表达式,并将结果分配给一个变量,然后用点表示法使用该变量:
var query = from x in y
orderby z
group x by x.Name into groups
// etc
select foo;
var page = query.Skip(50).Take(10);
Run Code Online (Sandbox Code Playgroud)
正如其他人所说,查询表达式只是在没有查询表达式的情况下被翻译成"普通"C#3,所以这样做没有任何代价.
好吧,'点'符号可以短得多.采取:
var result = from p in dc.Products
where p.Id > 5
select p;
Run Code Online (Sandbox Code Playgroud)
要么:
var result = dc.Products.Where(p => p.Id > 5);
Run Code Online (Sandbox Code Playgroud)
我更喜欢后者,因为它更短,更具可读性.