C# 将Include添加到存储库

C# 将Include添加到存储库,c#,entity-framework,repository,unit-of-work,C#,Entity Framework,Repository,Unit Of Work,我有一个工作库 public class Repository<TEntity> : IRepository<TEntity> where TEntity : class { protected readonly DbContext Context; public Repository(DbContext context) { Context = context; } public TEntity Get(int

我有一个工作库

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
    protected readonly DbContext Context;

    public Repository(DbContext context)
    {
        Context = context;
    }

    public TEntity Get(int id)
    {
        return Context.Set<TEntity>().Find(id);
    }

    public IEnumerable<TEntity> GetAll()
    {
        return Context.Set<TEntity>().ToList();
    }

    public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
    {
        return Context.Set<TEntity>().Where(predicate);
    }

    public TEntity SingleOrDefault(Expression<Func<TEntity, bool>> predicate)
    {
        return Context.Set<TEntity>().SingleOrDefault(predicate);
    }

    public void Add(TEntity entity)
    {
        Context.Set<TEntity>().Add(entity);
    }

    public void Remove(TEntity entity)
    {
        Context.Set<TEntity>().Remove(entity);
    }
}
但是,使用repository,我无法编写:

Provinces = Currentunitofwork.ProvinceRepository.Include(c => c.District).Include(c => c.District.Country).ToList();
我得到一个错误:

cannot convert lambda expression to type IDbSet<Province> because it is not a delegate type
无法将lambda表达式转换为IDbSet类型,因为它不是委托类型

这里有什么问题。

我怀疑您的代码正在将lambda表达式传递给IDbSet参数,并且无法将其转换为该类型

我无法进行测试,但它可以编译,如果该方法是Repository类的成员,请尝试此方法

public IEnumerable<TEntity> Include(params Expression<Func<TEntity, object>>[] includes)
{
    IDbSet<TEntity> dbSet = Context.Set<TEntity>();

    IEnumerable<TEntity> query = null;
    foreach (var include in includes)
    {
        query = dbSet.Include(include);
    }

    return query ?? dbSet;
}
public IEnumerable包含(参数表达式[]包含)
{
IDbSet dbSet=Context.Set();
IEnumerable查询=null;
foreach(包含在包含中的var)
{
query=dbSet.Include(Include);
}
返回查询??数据库集;
}

我怀疑您的代码正在将lambda表达式传递给IDbSet参数,并且无法将其转换为该类型

我无法进行测试,但它可以编译,如果该方法是Repository类的成员,请尝试此方法

public IEnumerable<TEntity> Include(params Expression<Func<TEntity, object>>[] includes)
{
    IDbSet<TEntity> dbSet = Context.Set<TEntity>();

    IEnumerable<TEntity> query = null;
    foreach (var include in includes)
    {
        query = dbSet.Include(include);
    }

    return query ?? dbSet;
}
public IEnumerable包含(参数表达式[]包含)
{
IDbSet dbSet=Context.Set();
IEnumerable查询=null;
foreach(包含在包含中的var)
{
query=dbSet.Include(Include);
}
返回查询??数据库集;
}

再次感谢@Adam Carr

这是现在的方法代码:

public IQueryable<TEntity> Include(params Expression<Func<TEntity, object>>[] includeExpressions)
{
    IDbSet<TEntity> dbSet = Context.Set<TEntity>();

    IQueryable<TEntity> query = null;
    foreach (var includeExpression in includeExpressions)
    {
        query = dbSet.Include(includeExpression);
    }

    return query ?? dbSet;
}
public IQueryable Include(参数表达式[]includeExpressions)
{
IDbSet dbSet=Context.Set();
IQueryable查询=null;
foreach(includeExpressions中的var includeExpression)
{
query=dbSet.Include(includeExpression);
}
返回查询??数据库集;
}
我改变的是将用作方法而不是属性。因此,不是:

IDbSet<TEntity> dbSet = Context.Set<TEntity>;
IDbSet dbSet=Context.Set;
我用过:

IDbSet<TEntity> dbSet = Context.Set<TEntity>();
IDbSet dbSet=Context.Set();

此外,由于@Adam Carr,我使用了IQueryable而不是IEnumerable

这是现在的方法代码:

public IQueryable<TEntity> Include(params Expression<Func<TEntity, object>>[] includeExpressions)
{
    IDbSet<TEntity> dbSet = Context.Set<TEntity>();

    IQueryable<TEntity> query = null;
    foreach (var includeExpression in includeExpressions)
    {
        query = dbSet.Include(includeExpression);
    }

    return query ?? dbSet;
}
public IQueryable Include(参数表达式[]includeExpressions)
{
IDbSet dbSet=Context.Set();
IQueryable查询=null;
foreach(includeExpressions中的var includeExpression)
{
query=dbSet.Include(includeExpression);
}
返回查询??数据库集;
}
我改变的是将用作方法而不是属性。因此,不是:

IDbSet<TEntity> dbSet = Context.Set<TEntity>;
IDbSet dbSet=Context.Set;
我用过:

IDbSet<TEntity> dbSet = Context.Set<TEntity>();
IDbSet dbSet=Context.Set();


另外,我使用了IQueryable而不是IEnumerable

您是否
使用System.Linq
使用System.Data.Entity在您的代码文件中?此方法是否添加到存储库类?@Ashwin Nair。我已经在使用它们了,否则,即使直接使用上下文也不会起作用。@Adam Carr。是的,此方法与repository RepositoryYou
是否使用System.Linq
使用System.Data.Entity在您的代码文件中?此方法是否添加到存储库类?@Ashwin Nair。我已经在使用它们了,否则,即使直接使用上下文也不会起作用。@Adam Carr。是的,此方法与repository repository无法编译的存储库属于同一类。错误:无法将方法组“Set”转换为非委托类型是的,这是一个键入错误!我已更新更正。请帮助我包含多个实体。使用该方法,我可以只包含一个实体。现在,我需要通过存储库包含三个实体。期待您的来信。谢谢。我不确定这是100%可能的,使用存储库的目的是将功能隔离到特定的功能。通过提供此选项,您基本上恢复到了DbContext,这将首先破坏存储库的用途。您最好再问一个问题,也可以在这个问题上获得更好的输入。无法编译。错误:无法将方法组“Set”转换为非委托类型是的,这是一个键入错误!我已更新更正。请帮助我包含多个实体。使用该方法,我可以只包含一个实体。现在,我需要通过存储库包含三个实体。期待您的来信。谢谢。我不确定这是100%可能的,使用存储库的目的是将功能隔离到特定的功能。通过提供此选项,您基本上返回到了DbContext,这将首先破坏存储库的用途。您最好再问一个问题,也可以在这个问题上获得更好的输入。那么AdamCarrs的答案应该是被接受的?那么AdamCarrs的答案应该是被接受的?