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 关键字,可以在查询中创建临时变量变得容易。
另一方面,流畅的语法具有更多未通过查询语法公开的方法和操作。另外,由于它们只是扩展方法,因此您可以编写自己的扩展方法。
我发现每次我开始使用查询语法编写 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);
根本不了解查询语法。我脑子里没有理由。让可以用 来实现。选择和匿名类型。我只是觉得那里的"标点符号"看起来更有条理。
流畅的界面,如果只有一个位置。 如果我需要选择或排序,我通常使用 Query 语法。
Fluent语法确实看起来更强大,它也应该更好地将代码组织成小的可重用方法。
这个问题是用 C# 标记的,但 Fluent 语法对 VB.NET 来说非常冗长。
我真的很喜欢 Fluent 语法,我尝试在可能的地方使用它,但在某些情况下,例如我使用连接的地方,我通常更喜欢 Query 语法,在这些情况下,我发现它更容易阅读,而且我认为有些人比 lambda 更熟悉 Query(类似 SQL(语法。
虽然我确实理解并喜欢流畅的格式,但出于可读性的原因,我暂时坚持使用查询。刚接触 LINQ 的人会发现查询读起来更舒服。
我更喜欢查询语法,因为我来自使用 SQL 的传统 Web 编程。 对我来说,绕开我的头要容易得多。 但是,它认为我将开始使用.哪里(lambda(,因为它肯定要短得多。
我已经使用 Linq 大约 6 个月了。当我第一次开始使用它时,我更喜欢查询语法,因为它与 T-SQL 非常相似。
但是,我现在逐渐转向前者,因为很容易编写可重用的代码块作为扩展方法并将它们链接在一起。尽管我确实发现将每个子句放在自己的行上对可读性有很大帮助。
我刚刚建立了我们公司的标准,我们强制使用扩展方法。我认为选择一个而不是另一个是个好主意,不要将它们混在代码中。扩展方法读起来更像其他代码。
理解语法没有所有的运算符,并且在查询周围使用括号并添加扩展方法毕竟只是恳求我从一开始就使用扩展方法。
但在大多数情况下,这只是个人喜好,少数例外。
来自Microsoft的文档:
通常,在编写 LINQ 查询时,建议您尽可能使用查询语法,并在必要时使用方法语法。两种不同形式之间没有语义或性能差异。查询表达式通常比用方法语法编写的等效表达式更具可读性。
https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/#query-expression-overview
他们还说:
若要开始使用 LINQ,您不必广泛使用 lambda。但是,某些查询只能用方法语法表示,其中一些查询需要 lambda 表达式。
https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/query-syntax-and-method-syntax-in-linq