流利和查询表达 - 一个优于其他人的利益吗?

时间:2008-10-18 03:36:50

标签: c# linq

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

两者之间是否有任何差异,或者其他人有什么特别的好处?

14 个答案:

答案 0 :(得分:244)

两者都不是更好:它们满足不同的需求。当您想要利用多范围变量时,查询语法就会出现。这种情况发生在三种情况:

  • 使用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 };

答案 1 :(得分:58)

当我可以用这种方式编写整个表达式时,我更喜欢使用后者(有时称为“查询理解语法”)。

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

我发现它更容易阅读。

答案 2 :(得分:29)

每种风格都有其优点和缺点。在连接时查询语法更好,它有一个有用的let关键字,可以轻松地在查询中创建临时变量。

另一方面,

Fluent语法包含更多未通过查询语法公开的方法和操作。此外,由于它们只是扩展方法,您可以自己编写。

我发现每次使用查询语法开始编写LINQ语句时,我最终都必须将其放在括号中,然后再使用流畅的LINQ扩展方法。查询语法本身没有足够的功能使用。

答案 3 :(得分:20)

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

答案 4 :(得分:14)

我根本没有得到查询语法。在我的脑海里没有理由。让我们可以实现。选择和匿名类型。我认为那里的“标点符号”看起来更有条理。

答案 5 :(得分:13)

如果只有一个地方,流畅的界面。如果我需要select或orderby,我通常使用Query语法。

答案 6 :(得分:8)

流畅的语法确实看起来确实更强大,它也应该更好地将代码组织成小的可重用方法。

答案 7 :(得分:5)

我知道这个问题是用C#标记的,但是使用VB.NET时,Fluent的语法非常冗长。

答案 8 :(得分:4)

我非常喜欢Fluent语法,我尝试尽可能地使用它,但在某些情况下,例如我使用连接的地方,我通常更喜欢查询语法,在这种情况下我觉得它更容易阅读,而我认为有些人比lambdas更熟悉Query(类似SQL)语法。

答案 9 :(得分:4)

虽然我理解并喜欢流畅的格式,但出于可读性原因,我暂时坚持使用Query。刚刚被介绍给LINQ的人会发现Query更加舒适。

答案 10 :(得分:4)

我更喜欢查询语法,因为我来自使用SQL的传统Web编程。我更容易缠头。但是,它认为我将开始使用.Where(lambda),因为它肯定要短得多。

答案 11 :(得分:4)

我已经使用Linq大约6个月了。当我第一次开始使用它时,我更喜欢查询语法,因为它与T-SQL非常相似。

但是,我现在逐渐转向前者,因为很容易将可重用的代码块作为扩展方法编写,并将它们链接在一起。虽然我确实发现将每个子句放在自己的行上有助于提高可读性。

答案 12 :(得分:3)

我刚刚制定了公司的标准,并强制使用Extension方法。我认为选择一个而不是另一个是个好主意,不要在代码中混淆它们。扩展方法更像其他代码。

理解语法没有所有运算符,并且在查询周围使用括号并添加扩展方法之后只是请求我从一开始就使用扩展方法。

但在大多数情况下,除了少数例外,这只是个人偏好。

答案 13 :(得分:1)

来自微软的文档:

<块引用>

作为编写 LINQ 查询的规则,我们建议您尽可能使用查询语法,并在必要时使用方法语法。两种不同形式之间没有语义或性能差异。查询表达式通常比以方法语法编写的等效表达式更具可读性。

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/#query-expression-overview

他们还说:

<块引用>

要开始使用 LINQ,您不必大量使用 lambda。 但是,某些查询只能用方法语法表示,其中一些需要 lambda 表达式

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/query-syntax-and-method-syntax-in-linq

相关问题