0

Linqクエリは、クエリによって返されるシーケンスが実際に繰り返されるまで実行されません。

繰り返し使用されるクエリがあるので、メソッド内にカプセル化します。延期された実行に干渉するかどうか知りたいのですが。
Linqクエリを以下のようなメソッドにカプセル化すると、メソッドが呼び出される1行目ではなく、2行目でクエリが実行されます。これは正しいです?

public IEnumerable<Person> GetOldPeopleQuery()
{
   return personList.Where(p => p.Age > 60);
}

public void SomeOtherMethod()
{
   var getWomenQuery = GetOldPeopleQuery().Where(p => p.Gender == "F"); //line 1
   int numberOfOldWomen = getWomanQuery.Count();  //line 2
}

PS違いがあれば、Linq-To-EFを使用しています。

4

1 に答える 1

2

クエリは、結果を最初に列挙するときに遅延評価されます。これは、メソッド内に配置しても影響を受けません。

ただし、コードには非常に非効率的な別のことがあります。戻ったらIEnumerable、コレクションに適用される次のlinqステートメントはlinq-to-objectsクエリになります。つまり、あなたの場合、データベースからすべての高齢者をロードしてから、メモリ内の女性を除外します。カウントと同じように、それはメモリ内で行われます。

代わりにIQueryable<Person>これらの2つの質問を返すと、linq-to-entitiesを使用して評価され、データベースでフィルタリングと合計を行うことができます。

于 2011-04-23T06:23:18.820 に答える