2016-08-09 11 views
2

このメソッドは、EF6 DbContextを公開するリポジトリにあります。一般的なEF6リポジトリメソッドが正しいSQLを生成しない

public IList<T> GetEntities<T>(Func<T, bool> predicate) where T : class 
{ 
    return db.Set<T>().Where(predicate).ToList<T>(); 
} 

このメソッドをSQLプロファイラで実行すると、述語はメモリ内で実行されます。 SQL文にwhere句は含まれていません。

アイデア?

答えて

2

述語はExpressionである必要があります。これにより、エンティティフレームワークは実際にSQLを生成して実行するのではなく、SQLを生成することができます。あなたはFuncに渡す場合は、実際にQueryable.Whereの代わりにEnumerable.Whereメソッドを呼び出している:

public IList<T> GetEntities<T>(Expression<Func<T, bool>> predicate) where T : class 
{ 
    return db.Set<T>().Where(predicate).ToList<T>(); 
} 
+0

感謝を!今は完璧に動作します。 –

3

.Whereは、Func<T, bool>またはExpression<Func<T, bool>>のいずれかを受け入れます。 Expression<Func<T, bool>>を渡すと、EFクエリが正しく機能するはずです。

public IList<T> GetEntities<T>(Expression<Func<T, bool>> predicate) where T : class 

あなたは同じようにそれを呼びたい:

GetEntities(x => x.Id == 34) 

あなたがFunc<T, bool>に渡し

IEnumerable<T>実装は実行、LINQのツーオブジェクトではなく、LINQのツーエンティティ使用しています。

関連する問題