我在這個時候我有存儲庫充滿了多個獲取方法。EF發送包含列表到存儲庫通過參數
E.q. Get1() => cxt.Entites.Include(e => e.obj1); Get2() => cxt.Entities.Include(e => e.obj1).Include(e => e.obj2)
依此類推。
有沒有好的方法,模式有一個GET方法,我可以通過參數發送inclues?
我在這個時候我有存儲庫充滿了多個獲取方法。EF發送包含列表到存儲庫通過參數
E.q. Get1() => cxt.Entites.Include(e => e.obj1); Get2() => cxt.Entities.Include(e => e.obj1).Include(e => e.obj2)
依此類推。
有沒有好的方法,模式有一個GET方法,我可以通過參數發送inclues?
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
IQueryable<TEntity> 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();
}
}
見msdn 庫模式您可以使用
_sampleRepostiory.Get(h=>h.Id>1,null,"Employees.Departments");
包括同與拉姆達
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
Expression<Func<TEntity, object>>[] includes)
{
IQueryable<TEntity> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
}
if (includes != null)
{
query = includes.Aggregate(query,
(current, include) => current.Include(include));
}
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}
消耗它這樣
var query = context.Customers
.Get(x=>x.Id>1,null,
c => c.Address,
c => c.Orders.Select(o => o.OrderItems));
我確實在我的項目如下:
public Entity[] GetAll(bool includeObj1, bool includeAllOthers) {
IQueryable<Entity> entity = ctx.Entities;
if (includeObj1)
entity = entity.Include(e => e.obj1);
if (includeAllOthers) {
entity = entity
.Include(e => e.obj2)
.Include(e => e.obj3)
.Include(e => e.obj4)
.Include(e => e.obj5);
}
return entity.ToArray();
}
像includeObj1
和includeObj2
提供了論據從實現中分離出庫的消費者和封裝任何數據訪問邏輯。
直接傳遞「包含這些屬性」命令到存儲庫意味着您知道存儲庫的工作方式,並假定它是某種排除抽象的ORM。
不,不好。我有很多要包含的對象。所以我不想用7+參數的方法。 – Nerf
@Nerf比7+方法具有相似的內容更好。如果您需要一種根據7種可能的狀態選項返回不同結果的方法,那麼可以預期有7個參數。 –
使用此方法的人必須知道並列舉所有包含的屬性。如果有人決定更改屬性名稱,那麼他應該通過項目Ctrl + Shift + F並更改所有文本用法。如果有人添加一個應該包含在eveyrwhere中的屬性,那麼他應該找到所有用法,併爲每個字符串添加「,NewProperty」。聽起來像SRP侵犯。我不能相信像[tdykstra](https://github.com/tdykstra)這樣的人可以編寫錯誤的代碼,所以應該有一些我不明白的東西,這讓我感到很難過: –
我把代碼是在msdn。我已經做了一個重載的方法是使用lamda表達式,你不需要使用字符串。請參閱https://stackoverflow.com/questions/5376421/ef-including-other-entities- generic-repository-pattern – Eldho
它引發參數null異常;/ – Nerf