调用DbContext.Set <t>()。Include()不查询包含的属性?</t>

时间:2012-03-23 13:27:52

标签: entity-framework entity-framework-4.1

我已关闭延迟加载和我的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之前正在考虑。我需要在那里添加包含。但不确定。

1 个答案:

答案 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非常相似。