在我的MVC应用程序中,我创建了执行CRUD操作的通用存储库,而不是直接使用Context对象。
上下文类名{EDMX]:CustomEntity.Edmx
通用存储库代码:
public interface IRepository<T> : IDisposable where T : class
{
IQueryable<T> GetAll();
IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
T FindFirst(Expression<Func<T, bool>> predicate);
T GetFirst();
T GetLast();
void Add(T entity);
void Delete(T entity);
void Update(T entity);
void SaveChanges();
}
public class GenericRepository<T> : IRepository<T> where T : class
{
private ObjectContext _context;
private IObjectSet<T> _objectSet;
public GenericRepository(ObjectContext context)
{
_context = context;
_objectSet = _context.CreateObjectSet<T>();
}
public IQueryable<T> GetAll()
{
return _objectSet;
}
public IEnumerable<T> Find(Expression<Func<T, bool>> predicate)
{
return _objectSet.Where<T>(predicate);
}
public T GetFirst()
{
return _objectSet.FirstOrDefault();
}
public T FindFirst(Expression<Func<T, bool>> predicate)
{
return _objectSet.First<T>(predicate);
}
public T GetLast()
{
return _objectSet.LastOrDefault();
}
public void Delete(T entity)
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
_objectSet.DeleteObject(entity);
}
public void Add(T entity)
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
_objectSet.AddObject(entity);
}
public void Update(T entity)
{
_context.ObjectStateManager.ChangeObjectState(entity, EntityState.Unchanged);
_objectSet.Attach(entity);
_context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
}
public void SaveChanges()
{
_context.SaveChanges();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (_context != null)
{
_context.Dispose();
_context = null;
}
}
}
使用genric存储库创建了三个存储库:
// CustomEntity-DataContext文件[Edmx]
vat dat1=GenricRepository<table1> (new CustomEntity());
vat dat1=GenricRepository<table2> (new CustomEntity());
vat dat3=GenricRepository<table3> (new CustomEntity());
这里上面为实体创建了三个存储库,这些存储库被称为相同的上下文。我想在LinQ等单个查询中从三个Repository中检索数据。
但我可以直接在上下文[EDMX]中执行此操作:
Using(CustomEntity custom=new CustomEntity())
{
var reocrds=(from t1 in custom.table1
from t2 in custom.table2
from t3 in custom.table3
where t1.id==t2.id&&t1.cusid==t3.cusid
select t1).ToList();
}
请您建议如何从存储库实体dat1,dat2,dat3
中检索数据[上下文中的相同查询]