开发利用通用存储库和工作单元模式而不是实体框架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-842be6f6e5ed 和 EF DbContext.Set<T> filtered record only
这些线索证实了我的思考过程,但结果却不同。任何解决方案?
感谢。
答案 0 :(得分:4)
您的谓词是Func<T, bool>
,它会强制查询使用Enumerable.Where
方法而不是Queryable.Where
方法。
将谓词更改为Expression<Func<T, bool>>
,一切都应该开始工作。