关于c#:流利和查询表达 – 一个人有什么好处而不是其他人?

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

我只要加上(括号)和.MethodCalls(),就改变了。

当我使用前者时,我通常每行放一个子句,如下所示:

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 >

我喜欢到重复的丑陋的Function关键字: </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)语法。


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

理解语法没有所有的操作符,在查询周围使用圆括号,并且在所有的后面添加扩展方法只是让我从一开始就使用扩展方法。

但在大多数情况下,这只是个人偏好,也有一些例外。