是
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;
等效?如果是这样,为什么要使用另一个呢?前者的语法似乎比后者更加神秘。
答案 0 :(得分: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
结束。
答案 1 :(得分:0)
查询表达式由编译器编译为方法语法, 无论你编写代码的方式是优先考虑的问题,开发人员都希望查询表达式来自sql background .. :)
答案 2 :(得分:0)
你是对的,后一种形式更具可读性,但有时你需要表达方法,比如当你想获得结果的Count
时,你当然可以混合这两种形式。