2

エンティティ フレームワーク 4.2 で汎用リポジトリと作業単位パターンを利用するデータ アクセス ソリューションを開発中。異常な動作が見られます。リポジトリを汎用にするために、次のように DbContext の Set メソッドを利用しました。

public class MyGenericRepository<T> 
{
     protected readonly IDbContext context;
     public virtual IEnumerable<T> FindBy(Func<T, bool> predicate)
     {
        return context.GetDbSet<T>().Where(predicate).First();
     }
}

IDbContext は次のようになります。

public interface IDbContext
{
    void Commit();
    void Attach<T>(T obj) where T : class;
    void Add<T>(T obj) where T : class;
    DbSet<T> GetDbSet<T>() where T : class;
    bool Remove<T>(T item) where T : class;
}

DbContext クラスは、IDbContext を次のように実装します。

public partial class MyEntities : IDbContext
{

    public DbSet<T> GetDbSet<T>() where T : class
    {
        return this.Set<T>();
    }
}  

repository.FindBy(c => c.CompanyId == 45) を実行すると、Sql Profiler はクエリにフィルターが含まれていないことを示します(company_id = 45)。クエリは Select * を実行します。

フィルターが存在することを期待して、調査を開始し、これに出くわしました。

http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/7d6705ac-f875-4c89-960b-842be6f6e5ed および EF DbContext.Set<T> フィルター処理されたレコードのみ

これらのスレッドは私の思考プロセスを確認しますが、結果は異なります. 解決策はありますか?

ありがとう。

4

1 に答える 1

5

述語はですFunc<T, bool>。これにより、クエリはEnumerable.Whereメソッドではなくメソッドを使用するようになりますQueryable.Where

述語をに変更するExpression<Func<T, bool>>と、すべてが機能し始めるはずです。

于 2012-11-06T21:04:06.530 に答える