LINQ:点表示法与查询表达式

Mar*_*ini 57 linq lambda .net-3.5

我开始一般使用LINQ(到目前为止使用XML和toSQL).我已经看到有时候有两种或更多种方法可以达到相同的效果.拿这个简单的例子,据我所知,两者都返回完全相同的东西:

SomeDataContext dc = new SomeDataContext();

var queue = from q in dc.SomeTable
        where q.SomeDate <= DateTime.Now && q.Locked != true
        orderby (q.Priority, q.TimeCreated)
        select q;

var queue2 = dc.SomeTable
        .Where( q => q.SomeDate <= DateTime.Now && q.Locked != true )
        .OrderBy(q => q.Priority)
        .ThenBy(q => q.TimeCreated);
Run Code Online (Sandbox Code Playgroud)

除了我在语法中可能犯的任何错误或缺少参数或差异之外,我们的想法是有两种表达同一事物的方法; 我知道第一种方法有一些局限性,"点符号"更完整,但除此之外,还有其他优点吗?

and*_*eer 54

"点"表示法通常称为Lambda语法.第一种表示法有许多名称,但我通常将其称为查询语法.

我在一个由10名开发人员组成的团队中工作,我们详细讨论了我们应该将其作为标准使用的问题.一般来说,经验丰富的(使用LINQ)开发人员迁移到Lambda语法,但有一些重要的例外.

Lambda更简洁,但执行多个表连接是一场噩梦.使用查询语法,联接更加清晰.另一方面,有许多LINQ操作只存在于Lambda语法中:Single(),First(),Count()等.

因此,使用您感觉最舒服的东西,并意识到当您获得经验时,您的偏好可能会改变.能够阅读两者都很有价值,肯定会出现两种情况都需要使用的情况.其他情况会使一种风格超过另一种风格.最后,它们都被翻译成相同的可执行代码.

  • 5 年后,方法链式 lambda 语法现在通常被称为 [Fluent Interface](http://en.wikipedia.org/wiki/Fluent_interface)。 (2认同)
  • 4 年后,微软似乎区分了查询和方法语法:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/query-syntax-and-method-syntax-内联 (2认同)

Jon*_*eet 28

我根据具体情况使用哪种语法对我的查询更具可读性.

在可能的情况下,我尽量避免混合和匹配两者,尽管有时它是可以的(例如,如果它是First()在查询结束时的单个调用).延迟执行意味着它是一样有效的是使用查询表达式,并将结果分配给一个变量,然后用点表示法使用该变量:

var query = from x in y
            orderby z
            group x by x.Name into groups
            // etc
            select foo;

var page = query.Skip(50).Take(10);
Run Code Online (Sandbox Code Playgroud)

正如其他人所说,查询表达式只是在没有查询表达式的情况下被翻译成"普通"C#3,所以这样做没有任何代价.

  • 当你想要将它们一起使用时,再将+1分开,而不是将第一个括在括号中,并将其余部分放在最后. (3认同)

Raz*_*zie 8

好吧,'点'符号可以短得多.采取:

var result = from p in dc.Products
             where p.Id > 5
             select p;
Run Code Online (Sandbox Code Playgroud)

要么:

var result = dc.Products.Where(p => p.Id > 5);
Run Code Online (Sandbox Code Playgroud)

我更喜欢后者,因为它更短,更具可读性.