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

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


当前回答

在VB。NET我非常喜欢查询语法。

我讨厌重复丑陋的函数关键字:

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到数据集(对象)查询

VB。NET:

Dim first10Rows = From r In dataTable1 Take 10

C#:

var first10Rows = (from r in dataTable1.AsEnumerable() 
                   select r)
                   .Take(10);

其他回答

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

在VB。NET我非常喜欢查询语法。

我讨厌重复丑陋的函数关键字:

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到数据集(对象)查询

VB。NET:

Dim first10Rows = From r In dataTable1 Take 10

C#:

var first10Rows = (from r in dataTable1.AsEnumerable() 
                   select r)
                   .Take(10);

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

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

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

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