Fluent and Query Expression — Is there any benefit(s) of one over other?
Linq是自泛型以来对.NET最大的改进之一,它为我节省了大量的时间和代码行。然而,与查询表达式语法相比,流畅的语法对我来说似乎更自然。
1 2 3 4 5 6 7 8 | var title = entries.Where(e => e.Approved) .OrderBy(e => e.Rating).Select(e => e.Title) .FirstOrDefault(); var query = (from e in entries where e.Approved orderby e.Rating select e.Title).FirstOrDefault(); |
这两者之间有什么区别吗?或者两者有什么特别的好处吗?
两者都不是更好的:它们服务于不同的需求。当您想利用多个范围变量时,查询语法就有了自己的特点。这在三种情况下发生:
- 使用let关键字时
- 当您有多个生成器(FROM子句)时
- 做连接时
以下是一个示例(来自LinqPad示例):
1 2 3 4 5 6 7 | string[] fullNames = {"Anne Williams","John Fred Smith","Sue Green" }; var query = from fullName in fullNames from name in fullName.Split() orderby fullName, name select name +" came from" + fullName; |
现在将其与方法语法中的相同内容进行比较:
1 2 3 4 5 | var query = fullNames .SelectMany (fName => fName.Split().Select (name => new { name, fName } )) .OrderBy (x => x.fName) .ThenBy (x => x.name) .Select (x => x.name +" came from" + x.fName); |
。
另一方面,方法语法公开了查询运算符的全部内容,并且通过简单的查询更加简洁。您可以通过混合查询语法和方法语法来获得两者的最佳效果。这通常在LINQ to SQL查询中完成:
1 2 3 4 5 6 | var query = from c in db.Customers let totalSpend = c.Purchases.Sum (p => p.Price) // Method syntax here where totalSpend > 1000 from p in c.Purchases select new { p.Description, totalSpend, c.Address.State }; |
当我可以用这种方式编写整个表达式时,我更喜欢使用后者(有时称为"查询理解语法")。
1 2 3 4 5 6 | var titlesQuery = from e in entries where e.Approved orderby e.Rating select e.Titles; var title = titlesQuery.FirstOrDefault(); |
我只要加上(括号)和
当我使用前者时,我通常每行放一个子句,如下所示:
1 2 3 4 5 | var title = entries .Where (e => e.Approved) .OrderBy (e => e.Rating) .Select (e => e.Title) .FirstOrDefault(); |
号
我觉得读起来容易一点。
每种风格都有其优缺点。查询语法在连接方面更好,它有一个有用的let关键字,使在查询中创建临时变量变得容易。
另一方面,Fluent语法有许多方法和操作,这些方法和操作不是通过查询语法公开的。另外,因为它们只是扩展方法,所以您可以编写自己的方法。
我发现,每当我开始使用查询语法编写一个LINQ语句时,我最终不得不将它放在括号中,然后返回到使用Fluent LINQ扩展方法。查询语法本身没有足够的功能。
在VB.NET我宁愿甚多的查询语法。 </P >
我喜欢到重复的丑陋的
1 2 3 4 5 6 7 | Dim fullNames = {"Anne Williams","John Fred Smith","Sue Green" }; Dim query = fullNames.SelectMany(Function(fName) fName.Split(). Select(Function(Name) New With {Name, fName})). OrderBy(Function(x) x.fName). ThenBy(Function(x) x.Name). Select(Function(x) x.Name &" came from" & x.fName) |
这是作为一个整洁的查询更多的可读和可维护的在我的意见: </P >
1 2 3 4 | query = From fullName In fullNames From name In fullName.Split() Order By fullName, name Select name &" came from" & fullName |
VB.NET的查询语法也更多的是powerful和不verbose比在C # http:/ / / / stackoverflow.com 6515130 / 284240 </P >
例如这个LINQ到数据集的查询(目标) </P >
VB.NET的: </P >
1 | Dim first10Rows = From r In dataTable1 Take 10 |
C:# </P >
1 2 3 | var first10Rows = (from r in dataTable1.AsEnumerable() select r) .Take(10); |
我根本不知道查询语法。在我的头脑里没有理由这么做。可以使用.select和匿名类型实现let。我只是觉得里面的"标点"看起来更有条理。
流畅的界面,如果有一个地方的话。如果我需要一个select或orderby,我通常使用查询语法。
流畅的语法的确看起来更强大,它还应该更好地将代码组织成可重用的小方法。
我知道这个问题是用C_标记的,但是用vb.net,流畅的语法是非常冗长的。
我用LINQ已经6个月了。当我第一次使用它时,我更喜欢查询语法,因为它与T-SQL非常相似。
但是,我现在逐渐转向前者,因为很容易将可重用的代码块编写为扩展方法,并将它们链接在一起。尽管我发现将每个子句放在自己的行上有助于提高可读性。
我更喜欢查询语法,因为我来自使用SQL的传统Web编程。对我来说,把头包起来容易多了。然而,它认为我将开始使用,在哪里(lambda),因为它肯定是更短。
虽然我确实理解并且喜欢流畅的格式,但出于可读性的原因,我暂时还是坚持查询。刚被介绍给Linq的人会发现查询更容易阅读。
我真的很喜欢流利的语法,我尽可能地使用它,但在某些情况下,例如我使用连接时,我通常更喜欢查询语法,在这些情况下,我发现它更容易阅读,我认为有些人比lambda更熟悉查询(类似SQL)语法。
我刚刚建立了我们公司的标准,我们强制使用扩展方法。我认为选择一个而不是另一个是个好主意,不要在代码中混淆它们。扩展方法的读取方式更像其他代码。
理解语法没有所有的操作符,在查询周围使用圆括号,并且在所有的后面添加扩展方法只是让我从一开始就使用扩展方法。
但在大多数情况下,这只是个人偏好,也有一些例外。