请帮助我清楚地理解这个概念。
我有一份IEnumberable员工名单,
例如:
var emplist = new List<Employee> ()
{
new Employee { EmpID = 1, EmpName = 'emp1', Age = 21},
new Employee { EmpID = 2, EmpName = 'emp2', Age = 26},
new Employee { EmpID = 3, EmpName = 'emp3',Age = 28}
};
的IEnumerable
var lst = from emp in emplist
where emp.Age > 25
select emp;
// Returns IEnumerable and subjected to deferred execution.
var singleemp = lst.Take(1); // for filtering first employee.
IQueryeable
IQueryeable<Employee> lst = from emp in emplist
where emp.Age > 25
select emp;
// Returns IQuereable and subjected to deferred execution.
var singleemp = lst.Take(1); // for filtering first employee.
现在我有两个IEnumerable和IQuereable场景,但在DB中生成的Sql查询是不同的。但两者都要延期执行。那么这两种情况如何产生差异呢!
可以请有人给出一个暗示......
答案 0 :(得分:0)
问题是您必须使用变量类型IQueryable<T>
才能使正在使用的查询引擎知道.Take(1)
操作(在本例中为SQL)。如果将此应用于IEnumerable<T>
,则在服务器上执行查询后,仅在C#中执行操作。您需要有一个IQueryable<T>
类型的变量才能应用额外的查询指令在服务器上执行。
如果在将查询分配给变量时使用var
作为类型,则应尽可能具体地键入变量,这应该是IQueryable<T>
或实现此接口的类型,如果您查询的对象也是可查询的。
在您的示例代码中,您使用的是List<T>
,因此使用可查询或可枚举的结果将完全相同。但是,如果您使用可查询类型进行操作,则会看到差异。