2017-03-29 3 views
0

IEnumerableについては、メモリにフィルタリングを適用し、IQueryableのようなSQL Serverではフィルタリングを適用しないという記事がたくさん出てきました。IEnumerableフィルタリングではなくSQL内でのメモリ?

しかし、

私はテーブルonly one has Id = '12345'のうち20 recordsを持っています。

私が行うと

IEnumerable<Customer> customer = _context.Customer.where(x => x.Id== '12345'); 

それは1行とnot of 20行を返します。 なぜですか?

私の理解では、それはそれは1つのレコードを返します後、私は

var result = customers.ToList(); 

を行う際に、最初に20行を返しますです。

+1

行は返されません。結果を反復処理するときに評価される式を返します。その式には、その評価に含まれる "where"節が含まれています。 – David

+1

"遅延実行"とは何かを誤解しています。それは、20行すべてが返されることを意味するものではありません。 Entity Frameworkで作成されたすべてのクエリにどれくらいの費用がかかるか考えてみましょう。それが意味することは、あなたのクエリはちょうどそのことです:クエリ。 'foreach'、' ToList'、 'ToArray'など何らかの反復の形で実行を強制するまでは実行されません。 –

+2

' customer'が'IEnumerable 'が 'IQueryable 'を保持できないという意味ではありません。 'IQueryable 'は 'IEnumerable 'を実装しています:https://msdn.microsoft.com/en-us/library/system.linq.iqueryable(v=vs.110).aspxそれで ' IEnumerable '、あなたの例では、基礎となるオブジェクトは' IQueryable 'です。 – David

答えて

0

この時点では、IQueryableインターフェイスでwhereを実行します。あなたが読んだことが何

IEnumerable<Customer> customer = _context.Customer.Where(x => x.Id == 12345); 

はそのようなものである(=の右側が早く、左サイドを実行していることに注意してください):

IEnumerable<Customer> customers = _context.Customer 
IEnumerable<Customer> clientFiltered = customers.Where(x => x.Id == 12345); 

あなたはonelinerとしてこれをしたい場合は、次の

_context.Customer.AsEnumerable().Where(x => x.Id == 12345); 

注:後で2つのケースでは、最初にIEnumerableにキャストしてから、より具体的にはWhereにしてください。

+0

Aaaahそれは私が欠けていた点です。基本的に、Where節を使用してIEnumerableを1行書くと、実際には上記の2行の問合せを意味します。したがって、フィルタリングはIEnumerableのためにメモリ内にありますか?とthatsなぜ私は20correctの代わりに1フィルタリングされたレコードを得ているのですか? – simbada

+0

@部分的に正しい。私の更新を参照してください。 –

関連する問題