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

两者之间有什么区别吗?或者两者之间有什么特别的好处吗?


当前回答

我真的很喜欢Fluent语法,我尽可能地使用它,但在某些情况下,例如我使用连接时,我通常更喜欢Query语法,在这些情况下,我发现它更容易阅读,而且我认为有些人更熟悉Query(类似sql)语法,而不是lambdas。

其他回答

我完全不懂查询语法。在我看来,没有理由这么做。let可以通过. select和匿名类型来实现。我只是觉得在里面加上标点符号看起来更有条理。

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

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

但在大多数情况下,这只是个人喜好,只有少数例外。

两者都不好:它们满足不同的需求。当您想要利用多个范围变量时,查询语法就发挥了作用。这种情况有三种:

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

虽然我确实理解并喜欢流畅的格式,但出于可读性的原因,我暂时坚持使用Query。刚接触LINQ的人会发现Query读起来要舒服得多。

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

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

我觉得这样更容易理解。