我已关闭延迟加载和我的DbContext上的代理创建。我正在使用Repository partern和UnitOfWork。我的UnitOfWork继承自DBConext。以下是我正在做的一个例子:
public class User
{
public Guid Id {get;set;}
public virtual Guid UserTypeId {get;set;} //foreign key to UserType and setup in the EF fluent mappings and it does load if I am using lazy loading.
public virtual UserType {get;set;}
}
public class UserType
{
public Guid Id {get;set;}
public string Name {get;set;}
}
这是我的UoW:
public IDbSet<TEntity> CreateSet<TEntity>() where TEntity : class
{
return base.Set<TEntity>();
}
我通过我的存储库查询上下文:
protected Expression<Func<TEntity, object>>[] Includes;
public IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> criteria, params Expression<Func<TEntity, object>>[] includes)
{
Includes = includes;
return GetSet().Where(criteria)
.AsEnumerable();
}
public IDbSet<TEntity> GetSet()
{
var set = _unitOfWork.CreateSet<TEntity>();
if(Includes != null)
{
foreach (var include in Includes)
{
set.Include(include);
}
}
return set;
}
所以,正如你所看到的那样,我传入了一个包含在我的查询中的表达式数组。所以我可以这样称呼它:
var users = userRespository.Get(u => u.Id == SomeGuid, u => u.UserType);
UserType未包含在查询中,我不知道是什么。我应该在DbContext上调用Set以外的东西吗?
更新:
我在调用base之前正在考虑。我需要在那里添加包含。但不确定。
答案 0 :(得分:3)
IQueryable
上的所有扩展程序通常以产生新IQueryable
的方式工作,因此如果您想要获得效果,则必须指定它:
public IDbSet<TEntity> GetSet()
{
var set = _unitOfWork.CreateSet<TEntity>();
if(Includes != null)
{
foreach (var include in Includes)
{
set = set.Include(include);
}
}
return set;
}
顺便说一下。它看起来与my older solution非常相似。