LINQ是对.NET以来最伟大的改进之一,它可以节省大量的时间和代码行.但是,对于我来说,流畅的语法似乎比查询表达式语法更自然.
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关键字时
当你有多个生成器(来自子句)
在做加入时
这是一个例子(来自LINQPad示例):
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;
现在将它与方法语法中的相同内容进行比较:
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查询中完成:
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 };
当我可以用这种方式编写整个表达式时,我更喜欢使用后者(有时称为"查询理解语法").
var titlesQuery = from e in entries where e.Approved orderby e.Rating select e.Titles; var title = titlesQuery.FirstOrDefault();
一旦我必须添加(括号).MethodCalls()
,我就改变了.
当我使用前者时,我通常每行放一个子句,如下所示:
var title = entries .Where (e => e.Approved) .OrderBy (e => e.Rating) .Select (e => e.Title) .FirstOrDefault();
我发现它更容易阅读.
每种风格都有其优点和缺点.当涉及到连接时,查询语法更好,并且它具有有用的let关键字,这使得在查询中创建临时变量变得容易.
另一方面,Fluent语法具有更多未通过查询语法公开的方法和操作.此外,因为它们只是扩展方法,您可以自己编写.
我发现每次我开始使用查询语法编写LINQ语句时,我最终都必须将它放在括号中并回退到使用流畅的LINQ扩展方法.查询语法本身没有足够的功能可供使用.
在VB.NET中,我更喜欢查询语法.
我讨厌重复丑陋的Function
关键词:
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)
在我看来,这个简洁的查询更具可读性和可维护性:
query = From fullName In fullNames From name In fullName.Split() Order By fullName, name Select name & " came from " & fullName
VB.NET的查询语法也比C#更强大,更简洁:https://stackoverflow.com/a/6515130/284240
例如,这个LINQ to DataSet(Objects)查询
VB.NET:
Dim first10Rows = From r In dataTable1 Take 10
C#:
var first10Rows = (from r in dataTable1.AsEnumerable() select r) .Take(10);
我根本没有得到查询语法.在我的脑海里没有理由.让我们可以实现.选择和匿名类型.我认为那里的"标点符号"看起来更有条理.
流畅的界面,如果只是在哪里.如果我需要select或orderby,我通常使用Query语法.
流畅的语法确实看起来确实更强大,它也应该更好地将代码组织成小的可重用方法.
我知道这个问题用C#标记,但是Fluent语法在VB.NET中非常冗长.