17

この質問を読んだ後、いくつかのことを片付ける必要があります。

IQueryable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;

IEnumerable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;

質問:

1) 次のように言っても問題ありません: 最初のクエリでは、SQLServer は where 句を含む操作全体を実行し関連する行のみSELECT *返し ます.

2) 単にコレクションを持っている場合はどうですか- 記憶の中に。( var lstMyPerson = new List<MyPerson>())

IQueryable<MyPerson> lst = from c in lstMyPerson 
where c.City == "<City>"
select c;

IEnumerable<MyPerson> custs = from c in lstMyPerson 
where c.City == "<City>"
select c;

今の実行の違いは何ですか?

4

1 に答える 1

34

1: いいえ、それは正しくありません

結果を に格納するだけですがIEnumerable<Customer>、結果を生成する式はまったく同じであるため、両方ともサーバー上で実行され、関連する行のみが返されます。

これにより、動作の違いが得られます。

IEnumerable<Customer> custs = from c in (IEnumerable<Customer>)db.Customers
    where c. City == "<City>"
    select c;

この場合、db.Customersコレクションを として使用するように強制していますIEnumerable<T>。これは、列挙されるとコレクション全体をフェッチします。

これに注意してください:

IEnumerable<Customer> x = from c in db.Customers
                          where c.City == "<City>"
                          select c;

これと同じではありません:

IEnumerable<Customer> x = from c in db.Customers
                          select c;
IEnumerable<Customer> y = x.Where(c => c.City == "<City>");

最初のケースでは、where句は SQL の一部になりますが、2 番目のケースではそうではありません。そのため、リンクされた質問/回答には違いがありますが、コードには違いはありません。

また、記述したステートメントのみが実際にはサーバー上で何も実行されないことに注意してください。これは、遅延コレクションのみを効果的に格納するためです。これらのコレクションを列挙すると、その時点で関連するビットがサーバー上で実行されます。

2:List<T>の拡張メソッドを実装または持っていませんIQueryable<T>。また、関連する LINQ 演算子が互換性のあるものを返すこともありません。IQueryable<T>

この場合、最初のものはコンパイルされません。

于 2012-06-21T06:52:13.083 に答える