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.

IQueryable

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 の 2 つのシナリオがありますが、DB で生成される Sql クエリは異なります。ただし、どちらも遅延実行の対象となります。では、この 2 つのシナリオがどのように違いを生むのでしょうか。

誰かこれについてヒントをください...

4

1 に答える 1

0

問題は、使用中のクエリ エンジン (この場合は SQL) に操作を知らせるIQueryable<T>ために変数を入力する必要があることです。.Take(1)これを に適用するとIEnumerable<T>、サーバーでクエリが実行された後、操作は C# でのみ実行されます。IQueryable<T>サーバーで実行される追加のクエリ命令を適用するには、型付き変数が必要です。

クエリを変数に割り当てるときに型として使用する場合var、変数はできるだけ具体的に型指定する必要がありIQueryable<T>ます。これは、クエリ対象のオブジェクトもクエリ可能である場合、またはこのインターフェイスを実装する型である必要があります。

サンプル コードでは を操作しているList<T>ため、クエリ可能または列挙可能を使用した結果はまったく同じになります。ただし、クエリ可能な型を操作している場合は、違いがわかります。

于 2013-02-16T06:39:01.703 に答える