asp.net-mvc如何执行联接使用表达式

发布时间: 2017/3/25 9:50:44
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我为我的项目使用实体框架包装。如果我使用只有一张桌子的 CRUD 操作,但不幸的是不是能联接两个表,它效果很好。

我见过的人在暗示包括,我还不能使用。

引用

此外我有这个但是我看不懂。

我分享我下面的 BaseRepository 类

 public class BaseRepository<T> : IBaseRepository<T> where T : class
 {
    private IUnitOfWork unitOfWork;
    private DbSet<T> dbSet;

    public BaseRepository(IUnitOfWork unitOfWork)
    {
        this.unitOfWork = unitOfWork;
        this.dbSet = unitOfWork.DbContext.Set<T>();
    }

    public virtual IEnumerable<T> Get(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = "")
    {
        IQueryable<T> query = dbSet;

        if (filter != null)
        {
            query = query.Where(filter);
        }

        foreach (var includeProperty in includeProperties.Split
            (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
        {
            query = query.Include(includeProperty);
        }

        if (orderBy != null)
        {
            return orderBy(query).ToList();
        }
        else
        {
            return query.ToList();
        }
    }

    public virtual IEnumerable<T> Get()
    {
        return dbSet.ToList();
    }

    public virtual IEnumerable<T> Get(Expression<Func<T, bool>> predicate)
    {
        return dbSet.Where(predicate);
    }

    public virtual T Get(object id)
    {
        return dbSet.Find(id);
    }

    public virtual IQueryable<T> Where(Expression<Func<T, bool>> predicate)
    {
        return dbSet.Where(predicate);
    }

    public virtual IQueryable<T> Query()
    {
        return dbSet;
    }

    public bool Any(Expression<Func<T, bool>> predicate)
    {
        return dbSet.Any(predicate);
    }

    public T First(Expression<Func<T, bool>> predicate)
    {
        return dbSet.First(predicate);
    }

    public T FirstOrDefault(Expression<Func<T, bool>> predicate)
    {
        return dbSet.FirstOrDefault(predicate);
    }

    public virtual void Insert(T entity)
    {
        dbSet.Add(entity);
    }

    public virtual void Update(T entity)
    {

        if (unitOfWork.DbContext.Entry(entity).State == EntityState.Detached)
        {
            dbSet.Attach(entity);
        }

        unitOfWork.DbContext.Entry(entity).State = EntityState.Modified;
    }

    public virtual void Delete(object id)
    {
        T entityToDelete = dbSet.Find(id);
        Delete(entityToDelete);
    }

    public virtual void Delete(T entity)
    {
        if (unitOfWork.DbContext.Entry(entity).State == EntityState.Detached)
        {
            dbSet.Attach(entity);
        }
        dbSet.Remove(entity);
    }

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                unitOfWork.DbContext.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    public IEnumerable<T> ExecWithStoreProcedure(string query, params object[] parameters)
    {
        return unitOfWork.DbContext.Database.SqlQuery<T>(query, parameters);
    }
}

请让我知道我需要在我的 BaseRepository 中执行,以便我可以执行联接什么变化。

解决方法 1:

好吧...因此,看你基地的存储库,它看起来像你有到位的事情。我最好的猜测是你只是越来越混乱使用存储库模式。所以,你向我们展示采用类型 BaseRepository <T> 。您特定的存储库是如何创造的?如你必须有,说,AccountRepository 或 ContactRepository,需要利用通用的基础存储库这样的事情在 UnitOfWork 类中︰

private IBaseRepository<Account> _accountRepository;    
    public IBaseRepository<Account> AccountRepository
    {
        get { return _accountRepository ?? (_accountRepository = new BaseRepository<Account>(_databaseFactory)); }
    }

您可以调用如下所示︰

private IBaseRepository<Account> accountRepo { get { return UnitOfWork.AccountRepository; } }

和使用像 accountRepo.Get(),会给你所有帐户的列表。

如果这是你如何使用您的存储库,然后所有你需要做的联接是添加存储库中的其他实体︰

private IBaseRepository<Contact> contactRepo { get { return UnitOfWork.ContactRepository; } }

和执行联接如下所示︰

return (from c in contactRepo.GetAll()
            join a in accountRepo.GetAll() on c.AccountId equals a.AccountId
            where a.Name == "Test Account Name"
            select c).ToList();

上述会给你属于具有名称的帐户的所有联系人 ="测试帐户名称"。

让我知道它是如何工作的你。

赞助商