调用 DbContext.Set<T>().Include() 不是查询包含的属性吗?

DDi*_*ita 4 entity-framework entity-framework-4.1

我已关闭 DbContext 上的延迟加载和代理创建。我正在使用存储库合作伙伴和工作单元。我的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;}
}
Run Code Online (Sandbox Code Playgroud)

这是我的 UoW 里面的:

        public IDbSet<TEntity> CreateSet<TEntity>() where TEntity : class
        {
            return base.Set<TEntity>();
        }
Run Code Online (Sandbox Code Playgroud)

我通过我的存储库查询上下文:

 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;

            }
Run Code Online (Sandbox Code Playgroud)

因此,正如您所看到的,我正在传递要包含在查询中的表达式数组。所以我可能会这样称呼它:

var users = userRespository.Get(u => u.Id == SomeGuid, u => u.UserType);
Run Code Online (Sandbox Code Playgroud)

UserType 未包含在查询中,我不知道是什么。我应该在 DbContext 上调用除 Set 之外的其他方法吗?

更新

我在想,在调用 base.Set 之前,我需要在那里添加包含内容。但不确定。

Lad*_*nka 5

所有扩展方法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;
}
Run Code Online (Sandbox Code Playgroud)

顺便提一句。它看起来与我的旧解决方案非常相似。