阅读this问题后, 我需要澄清一些事情。
IQueryable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
IEnumerable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
问题:
1)可以这样说:在第一个查询中,SQLServer正在运行整个操作,包括where子句并返回仅相关行 - 而第二个查询执行SELECT *
...并将所有行返回到C#和 THEN 过滤器?
2)如果我只有集合 - 在内存中怎么办? (var lstMyPerson = new List<MyPerson>()
)
IQueryable<MyPerson> lst = from c in lstMyPerson
where c.City == "<City>"
select c;
VS
IEnumerable<MyPerson> custs = from c in lstMyPerson
where c.City == "<City>"
select c;
现在执行会有什么不同?
答案 0 :(得分:33)
1:不,这是不正确的
由于您只是将结果存储到IEnumerable<Customer>
中,但仍然具有产生结果的完全相同的表达式,因此它们都将在服务器上执行并仅返回相关行。
你会得到与此相关的行为差异:
IEnumerable<Customer> custs = from c in (IEnumerable<Customer>)db.Customers
where c. City == "<City>"
select c;
在这种情况下,您强制将db.Customers
集合用作IEnumerable<T>
,枚举时将获取整个集合。
请注意:
IEnumerable<Customer> x = from c in db.Customers
where c.City == "<City>"
select c;
与此不同:
IEnumerable<Customer> x = from c in db.Customers
select c;
IEnumerable<Customer> y = x.Where(c => c.City == "<City>");
在第一种情况下,where
子句将成为SQL的一部分,而第二种情况则不会。这就是为什么链接的问题/答案涉及差异,而你的代码没有。
另请注意,仅您编写的语句实际上并不会在服务器上执行任何操作,因为它们实际上只会存储一个惰性集合。如果您继续并枚举这些集合,那么 将在服务器上执行相关位。
2:List<T>
没有为IQueryable<T>
实现或拥有扩展方法,所涉及的LINQ运算符也不会返回与IQueryable<T>
兼容的任何内容
在这种情况下,第一个不会编译。