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();
两者之间有什么区别吗?或者两者之间有什么特别的好处吗?
当我可以用这种方式编写整个表达式时,我更喜欢使用后者(有时称为“查询理解语法”)。
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关键字时
当你有多个生成器时(来自子句)
当进行连接时
下面是一个例子(来自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 };
在VB。NET我非常喜欢查询语法。
我讨厌重复丑陋的函数关键字:
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到数据集(对象)查询
VB。NET:
Dim first10Rows = From r In dataTable1 Take 10
C#:
var first10Rows = (from r in dataTable1.AsEnumerable()
select r)
.Take(10);
微软的文件如下:
作为一条规则,当你编写LINQ查询时,我们建议你尽可能使用查询语法,必要时使用方法语法。在两种不同的形式之间没有语义或性能上的差异。查询表达式通常比用方法语法编写的等效表达式更具可读性。
https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/#query-expression-overview
他们还说:
要开始使用LINQ,你不需要大量使用lambdas。但是,某些查询只能用方法语法表示,其中一些查询需要lambda表达式。
https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/query-syntax-and-method-syntax-in-linq