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的答案应该是被接受的?