当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《流利和查询表达-一个优于其他人的利益吗?》经验,为你挑选了8个好方法。

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

这两者之间是否有任何区别,或者一方面有什么特别的好处呢?



1> Joe Albahari..:

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

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


它选择单个单词(anne,williams,john等)以及匿名类型的全名.这允许您"携带"原始全名,以便您可以访问查询其余部分中的全名和单个单词.
很好的答案.你能告诉我一些关于".Select(name => new {name,fName})"的信息吗?

2> Jay Bazuzi..:

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

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

我发现它更容易阅读.



3> James Newton..:

每种风格都有其优点和缺点.当涉及到连接时,查询语法更好,并且它具有有用的let关键字,这使得在查询中创建临时变量变得容易.

另一方面,Fluent语法具有更多未通过查询语法公开的方法和操作.此外,因为它们只是扩展方法,您可以自己编写.

我发现每次我开始使用查询语法编写LINQ语句时,我最终都必须将它放在括号中并回退到使用流畅的LINQ扩展方法.查询语法本身没有足够的功能可供使用.



4> Tim Schmelte..:

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


我对那些不能使用查询风格的VB开发人员表示同情.

5> Instance Hun..:

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


使用流畅的语法,多个连接可以很快地变得非常费力.我通常会使用流利的自己 - 除非涉及加入.

6> James Curran..:

流畅的界面,如果只是在哪里.如果我需要select或orderby,我通常使用Query语法.



7> Kozyarchuk..:

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



8> Larsenal..:

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

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有