2015-11-18 13 views
7

現在、C#4.0でEntityFramework 6.0を使用してアプリケーションを作成しています。Where句はSQLクエリに含まれていません

データベースからアイテムのリストを取得しようとしていますが、問題は、EFフレームワークによって生成されたSQLクエリにwhere句が含まれていないことです。

したがって、テーブル/ビュー全体がメモリにロードされ、わずか2〜3個のアイテムを取得するのに約10秒かかります。以下は

、私GenericRepostitoryから方法:

public IList<TEntity> GetList(Func<TEntity, bool> where, params Expression<Func<TEntity, object>>[] navigationProperties) 
{ 
    using (var dbContextScope = contextScopeFactory.CreateReadOnly()) 
    { 
     IQueryable<TEntity> dbQuery = Context.Set<TEntity>().AsQueryable(); 

     foreach (Expression<Func<TEntity, object>> navigationProperty in navigationProperties) 
      dbQuery = dbQuery.Include<TEntity, object>(navigationProperty); 

     var list = dbQuery 
      .AsNoTracking() 
      .Where(where); 

     Context.Database.Log = s => Debug.WriteLine(s); 

     return list.ToList<TEntity>(); 
    } 
} 

そして、私はこのようにそれを呼び出す:

var repository = repositoryFactory.Get<Context, Entity>(); 
var items = repository.GetList(x => x.FakeID <= 10); 

リターン結果は良いのですが、それは取得する約10秒かかります。 そして、デバッグによって生成されたSQLクエリが書き込まれるとき、where句はどこにもありません。

where Get節にwhere句を含めるにはどうすればよいですか?

私はこれらの情報で十分に明確であり、私の英語は申し訳ありません。

+1

' Context.Set ().AsQueryableを()が必要です'? AsQueryableはここでは必要ないはずです。 –

+0

はい、私はそれを削除すべきではありません。それは私が数時間以来この問題に悩まされていて、いろいろなことを試したからです... – Mica

答えて

7
あなたの助けのためにあなたに感謝することはあなたがまだでそれを呼び出すことができます

GetList(Func<TEntity, bool> where, ... 

から

GetList(Expression<Func<TEntity, bool>> where, ... 

にあなたのメソッドのシグネチャを変更

、とにかく/

: それは私の母国語ではありませんラムダ、あなたのように今。 Whereは、データベースから読み込まれた完全なリストに対して、 "linq-to-objects"として使用されました。式EFを使用すると、必要なSQLを生成することができます。

+0

ありがとう、それは働いています! :) – Mica

7

whereパラメータの種類はこれ

dbQuery.Where(where) 

は、フィルタリング前にメモリにデータをロードし、Enumerable.Where拡張メソッドを使用して、Func<TEntity, bool>あります。 `` DbContext Context`場合ではありませんどのような `;あなたは(SQLに変換されます)Queryable.Whereメソッドを使用したい場合は、Expression<Func<TEntity, bool>>パラメータ

public IList<TEntity> GetList(Expression<Func<TEntity, bool>> where, 
           params Expression<Func<TEntity, object>>[] navigationProperties) 
+0

あなたとあなたの説明に感謝します。私は違いを今すぐ理解する! :) – Mica

関連する問題