【发布时间】:2016-02-16 04:42:15
【问题描述】:
我正在为我的项目使用实体框架包装器。如果我只使用一个表进行 CRUD 操作,它工作正常,但不幸的是我无法连接两个表。
我看到有人建议包含我也无法使用。
我也有this,但我听不懂。
我在下面分享我的 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 中执行哪些更改,以便我可以执行加入。
【问题讨论】:
-
你有什么不明白的?
-
我不明白如何封装一个复杂的查询。我想使用像 var empList = (from e in empRepository.Where(e => e.EmpID==123) join d in deptRepository在 e.DeptID 上等于 d.DeptID
-
我从您的问题中删除了存储库模式引用,因为您不了解该模式的目的(作为持久层的抽象以降低复杂性)。任何暴露 LINQ 的类(只是包装 Linq To Sql)根本不是抽象。你仍然必须知道你的 ORM 的局限性才能使用它。您能否描述一下您的解决方案与直接使用 EF 接口相比有哪些好处?我只是没看到。接受的答案看起来与直接使用 EF 完全一样,并且清楚地说明了我的观点。
标签: asp.net-mvc entity-framework linq