2017-05-31 48 views
1

我在這個時候我有存儲庫充滿了多個獲取方法。EF發送包含列表到存儲庫通過參數

E.q. Get1() => cxt.Entites.Include(e => e.obj1); Get2() => cxt.Entities.Include(e => e.obj1).Include(e => e.obj2)

依此類推。

有沒有好的方法,模式有一個GET方法,我可以通過參數發送inclues?

回答

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

Similar SO question

+0

使用此方法的人必須知道並列舉所有包含的屬性。如果有人決定更改屬性名稱,那麼他應該通過項目Ctrl + Shift + F並更改所有文本用法。如果有人添加一個應該包含在eveyrwhere中的屬性,那麼他應該找到所有用法,併爲每個字符串添加「,NewProperty」。聽起來像SRP侵犯。我不能相信像[tdykstra](https://github.com/tdykstra)這樣的人可以編寫錯誤的代碼,所以應該有一些我不明白的東西,這讓我感到很難過: –

+0

我把代碼是在msdn。我已經做了一個重載的方法是使用lamda表達式,你不需要使用字符串。請參閱https://stackoverflow.com/questions/5376421/ef-including-other-entities- generic-repository-pattern – Eldho

+0

它引發參數null異常;/ – Nerf

1

我確實在我的項目如下:

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

includeObj1includeObj2提供了論據從實現中分離出庫的消費者和封裝任何數據訪問邏輯。
直接傳遞「包含這些屬性」命令到存儲庫意味着您知道存儲庫的工作方式,並假定它是某種排除抽象的ORM。

+0

不,不好。我有很多要包含的對象。所以我不想用7+參數的方法。 – Nerf

+0

@Nerf比7+方法具有相似的內容更好。如果您需要一種根據7種可能的狀態選項返回不同結果的方法,那麼可以預期有7個參數。 –