IEnumerable和IQueryable中的延迟执行有何不同

时间:2013-02-16 05:22:01

标签: linq

请帮助我清楚地理解这个概念。

我有一份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查询是不同的。但两者都要延期执行。那么这两种情况如何产生差异呢!

可以请有人给出一个暗示......

1 个答案:

答案 0 :(得分:0)

问题是您必须使用变量类型IQueryable<T>才能使正在使用的查询引擎知道.Take(1)操作(在本例中为SQL)。如果将此应用于IEnumerable<T>,则在服务器上执行查询后,仅在C#中执行操作。您需要有一个IQueryable<T>类型的变量才能应用额外的查询指令在服务器上执行。

如果在将查询分配给变量时使用var作为类型,则应尽可能具体地键入变量,这应该是IQueryable<T>或实现此接口的类型,如果您查询的对象也是可查询的。

在您的示例代码中,您使用的是List<T>,因此使用可查询或可枚举的结果将完全相同。但是,如果您使用可查询类型进行操作,则会看到差异。