【问题标题】:Add Include to repository将包含添加到存储库
【发布时间】:2016-06-02 00:26:45
【问题描述】:

我有一个工作存储库。

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);
    }
}

正如我在编码存储库中所读到的,在您真正需要之前不要添加任何类。现在,我需要添加 Include。我在这个社区找到了这个Use Include() method in repository:

public static class IncludeExtension
{
    public static IQueryable<TEntity> Include<TEntity>(this IDbSet<TEntity> dbSet,
                                                   params Expression<Func<TEntity, object>>[] includes)
                                                   where TEntity : class
    {
        IQueryable<TEntity> query = null;
        foreach (var include in includes)
        {
            query = dbSet.Include(include);
        }

        return query ?? dbSet;
    }
}

然后,我将其更改为适合我的代码(我认为):

public IEnumerable<TEntity> Include(IDbSet<TEntity> dbSet,
                                    params Expression<Func<TEntity, object>>[] includes)
{
    IEnumerable<TEntity> query = null;
    foreach (var include in includes)
    {
        query = dbSet.Include(include);
    }

    return query ?? dbSet;
}

通过直接访问上下文,我可以写:

Provinces = _cmsDbContext.Provinces.Include(c => c.District).Include(c => c.District.Country).ToList();

但是,有了存储库,我不能写:

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

请问这里有什么问题。

【问题讨论】:

  • 你的代码文件中有using System.Linq;和using System.Data.Entity;吗?
  • 这个方法是否被添加到 Repository 类中?
  • @Ashwin Nair。我已经在使用它们,否则,即使直接使用上下文也不起作用。
  • @亚当卡尔。是的,这个方法在同一个仓库类Repository

标签: c# entity-framework repository unit-of-work


【解决方案1】:

我怀疑您的代码将 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;
}

【讨论】:

  • 无法编译。错误:无法将方法组“Set”转换为非委托类型
  • 是的,这是一个打字错误!我已经更新了更正。
  • 请帮助我包含多个实体。使用这种方法,我只能包含一个实体。现在,我需要通过存储库包含三个实体。期待着听到您的意见。谢谢。
  • 我不确定这是否 100% 可能,使用存储库的目的是将功能隔离到特定功能。通过提供这个,您基本上是恢复到 DbContext,这首先会破坏存储库的目的。
  • 你最好再问一个问题,这样你就可以在这个问题上获得更好的意见。
【解决方案2】:

再次感谢@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;
}

我改变的是使用 Set 作为方法而不是属性。所以,而不是:

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

我用过:

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

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

【讨论】:

  • 所以 AdamCarrs 的回答应该是被接受的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 2013-12-17
  • 2014-01-01
相关资源
最近更新 更多