2016-10-31 8 views
0

IQueryable<int>に参加しようとしました。エンティティIDのリストはIQueryable<Entity>です。私は次のコードを使用します。このためEFコア参加エンティティIQueryable with IQueryable

IQueryable<Entity> entityQuery = _context.Entities.Where(x => ...); 
IQueryable<int> idQuery = _context.AccessRights.Where(x => ...).Select(x => x.Id); 
query = entityQuery.Join(idQuery, x => x.Id, x => x, (x, y) => x); 

このコードは、メモリ内のリストと協力して、私はSQLにLINQでそれをしようとした場合、しかし、Joinは無視なっています。

私はidsをメモリにロードしたくありません。これはLINQ to SQLでも可能ですか?

+0

'_context.Ids'は、データベーステーブルにマップされていますか?いいえ、それは不可能です、実際には 'IQueryable 'でしょうか? –

+0

@IvanStoev 'IQueryable 'は、一致するEntity.Idを持つ複数のエンティティIDの選択です。 –

+0

EFコアには、SQLに変換できないクエリをいくつかの部分に分割し、それらを別々に実行してメモリにマージするという概念があります。ログオンを有効にすると、少なくとも2つのSQLクエリが実行されていることがわかります。そうすれば、 'entityQuery'には' join'はありませんが、その結果がアカウントになるはずです。 –

答えて

1

あなたのような何かができる:これは、メモリにIDをロードせずに探している結果を得るでしょう

IQueryable<Entity> entityQuery = _context.Entities.Where(x => ...); 
IQueryable<int> idQuery = _context.AccessRights.Where(x => ...).Select(x => x.Id); 
entityQuery = entityQuery.Where(x => idQuery.Contains(x.Id)); 

。しかし、それはそれを理想的ではない巨大なSQL INステートメントに変換するかもしれません。

それとも、直接て、AccessRightsに参加することができます:

IQueryable<Entity> entityQuery = from e in _context.Entities.Where(x => ...) 
           join ar in _context.AccessRights.Where(x => ...) 
            on e.Id equals ar.Id 
           select e;