LINQ:点符号与查询expression式

一般来说,我开始使用LINQ(到目前为止XML和SQL)。 我已经看到,有时有两种或两种以上的方法来达到相同的结果。 以这个简单的例子来说,据我所知,两者都返回完全一样的东西:

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); 

除了我在语法上可能犯的错误或缺失的参数或差异之外,这个想法是有两种expression同一事物的方式; 我知道第一种方法有一些局限性,“点符号”更完整,除此之外,还有其他的优点吗?

“点”符号通常被称为Lambda语法。 第一个表示法有许多名字,但我通常把它称为查询语法。

我在一个由10位开发人员组成的团队中工作,我们详细地讨论了我们应该使用哪一个作为标准。 一般来说,更有经验的(有LINQ的)开发人员会迁移到Lambda语法,但有一些重要的例外。

Lambda更简洁,但执行多个表连接是一场噩梦。 查询语法的连接更清晰。 另一方面,有一些LINQ操作只存在于Lambda语法中:Single(),First(),Count()等

所以,使用你感觉最舒服的东西,并意识到随着你获得经验,你的偏好可能会改变。 能够阅读这两个文件是非常有价值的,肯定会有一些情况,你必须使用一点点。 其他的情况也会使他们对另一种风格产生一种风格。 最后,它们都被转换成相同的可执行代码。

我使用哪种语法对我的查询更具可读性,在个案的基础上。

在可能的情况下,尽量避免混合和匹配,尽pipe有时也可以(例如,如果在查询结束时对First()进行单个调用)。 延迟执行意味着使用查询expression式并将结果赋值给variables同样有效,然后使用该variables使用点符号:

 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); 

正如其他人所说,查询expression式只是被翻译成“正常”的C#3没有查询expression式,所以这样做没有惩罚。

那么,'点'符号可以更短。 采取:

 var result = from p in dc.Products where p.Id > 5 select p; 

要么:

 var result = dc.Products.Where(p => p.Id > 5); 

我更喜欢后者,因为它更短,更可读。

我发现Lambda符号更整齐,更简洁。 我只是觉得很烦人,如果你有一个Lambdaexpression式在方法调用中的任何地方 ,你不能在debugging模式下实时修改代码…

他们编译到相同的代码,或者更确切地说,第一个翻译成第二个,然后编译。

你是对的,不同的是,第一个版本更清洁,但更有限。 在第二个例子中,您可以使用已经存在的委托,例如:

 Func<int, bool> isEven = i => i%2 == 0; Enumerable.Range(10).Where(isEven).ToList().ForEach(Console.WriteLine);