EF DbContext.Set <t>仅过滤记录...不起作用</t>

时间:2012-11-06 20:58:37

标签: c# entity-framework entity-framework-4.1 repository-pattern

开发利用通用存储库和工作单元模式而不是实体框架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 =&gt; c.CompanyId == 45)时,Sql Profiler会将查询显示为 NOT 包含任何过滤器(company_id = 45)。查询执行Select *。

期待过滤器存在,我开始研究并遇到了这个,

http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/7d6705ac-f875-4c89-960b-842be6f6e5edEF DbContext.Set<T> filtered record only

这些线索证实了我的思考过程,但结果却不同。任何解决方案?

感谢。

1 个答案:

答案 0 :(得分:4)

您的谓词是Func<T, bool>,它会强制查询使用Enumerable.Where方法而不是Queryable.Where方法。

将谓词更改为Expression<Func<T, bool>>,一切都应该开始工作。