【问题标题】:LINQ to SQL: lambda expression vs .Where() [duplicate]LINQ to SQL:lambda 表达式与 .Where() [重复]
【发布时间】:2014-05-03 02:55:27
【问题描述】:

var movies = from m in db.Movies
             select m;

movies = movies.Where(s => s.Title.Contains(searchString));

var movies = from m in db.Movies
             where String.Equals(m.Title,searchString)
             select m;

等价的?如果是这样,为什么要使用一个而不是另一个?前者的语法似乎比后者更神秘。

【问题讨论】:

  • 这不是相当重复。这个问题更多的是关于编译查询中包含的内容。

标签: c# sql linq lambda


【解决方案1】:

在幕后,正在进行一些翻译。

对于 LINQ to SQL(和 LINQ to Entities),select 关键字有效地结束查询。因此,第二个示例将过滤器作为 SQL 查询的一部分,而第一个示例在查询之后执行。

还有第三种方式进行 LINQ 查询,称为流畅语法:

var movies = db.Movies.Where(s => s.Title.Contains(searchString));

如果您查看signature of Where,您会发现:

IQueryable<T> Where(IQueryable<T> source, Expression<Func<T,bool>> predicate);

关键是predicate 的类型:它是一个 (lambda) 函数的表达式,而不仅仅是一个 (lambda) 函数。这让 .Net 可以动态地将 Expression 对象转换为 SQL。对于查询语法,本次解析结束于select

【讨论】:

    【解决方案2】:

    在编译代码时,编译器会将查询表达式编译为方法语法, 无论您编写代码的方式是偏好问题,来自 sql 背景的开发人员都更喜欢查询表达式.. :)

    【讨论】:

      【解决方案3】:

      你说得对,后一种形式更具可读性,但有时你需要表达式方法,比如当你想得到结果的Count时,当然你可以将这两者混合使用。

      【讨论】:

        猜你喜欢
        • 2011-06-01
        • 2011-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        相关资源
        最近更新 更多