0

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

我有一个 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<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 查询是不同的。但两者都受到延期执行。那么这两种情况有什么不同!

请有人对此提供提示...

4

1 回答 1

0

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

如果var在将查询分配给变量时使用 as 类型,则应尽可能具体地对变量进行类型化,并且IQueryable<T>如果您要查询的对象也是可查询的,则 this 应该是或实现此接口的类型。

在您的示例代码中,您正在对 a 进行操作List<T>,因此使用可查询或可枚举的结果将完全相同。但是,如果您在可查询类型上进行操作,您将看到不同之处。

于 2013-02-16T06:39:01.703 回答