2013-01-15 41 views
2

我使用實體框架5,有一個通用的存儲庫,其內有幾種方法,如兩個Get()方法如下:需要接受實體ID和包括通用EF方法

public TEntity GetById(int id) 
{ 
    return DbSet.Find(id); 
} 

public TEntity Get(
    Expression<Func<TEntity, bool>> filter = null, 
    IEnumerable<string> includePaths = null) 
{ 
    IQueryable<TEntity> query = DbSet; 

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

    if (includePaths != null) 
    { 
     query = includePaths.Aggregate(query, (current, includePath) => current.Include(includePath)); 
    } 

    return query.SingleOrDefault(); 
} 

這些都是都非常有幫助的,但是當我想打一個稍微複雜GetById()調用和檢索,同時一些實體引用,就像這樣:

var user = _userRepository.GetById(
    id, 
    new List<string> { "Roles", "Invoices" }); 

我最終不得不推出實體特定的(所以非泛型)爲每個實體調用GetById(id,includes),以便我可以訪問它們的s在lambda,即用戶ID或InvoiceId等pecific ID域

public User GetById(
    int id, 
    IEnumerable<string> includes) 
{ 
    return Get(
     (u => u.UserId == id), 
     includes); 
} 

看來,我不能,我的平均EF技能,工作如何DbSet.Find(ID)的善良與結合以通用方式調用.Include()調用。

所以問題是 - 是否有一種方法來編寫一個通用的EF方法,我可以用它來獲取一個實體的id幷包含一些引用,並且依次刪除編寫實體特定的GetById(id,includes )電話就像我上面所做的。

在此先感謝。

回答

6

繼承人我怎麼做我的通用存儲庫:這是使用lambda

public T GetBy(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] includes) 
    { 
     var result = GetAll(); 
     if (includes.Any()) 
     { 
      foreach (var include in includes) 
      { 
       result = result.Include(include); 
      } 
     } 
     return result.FirstOrDefault(predicate); 
    } 

注意包括和FirstOrDefault,而不是找到,但結果是一樣的。

您可以檢查出完整的源代碼對我的通用倉庫here

您可以通過以下稱之爲:

var entity = myRepository.GetBy(e=>e.Id == 7, /*Includes*/ e=> e.ANavigationProperty, e=>e.AnotherNavProperty); 

編輯:

我不使用通用的倉庫了,而不是我使用擴展方法的基礎上動態查詢。我發現這得到更好的重用。 (請參閱我的文章在這裏Composable Repositories

+0

嗨盧克,你能告訴我電話的一個例子您GetBy()方法嗎? – Bern

+0

@bern當然看到編輯 –

+1

@bern我前段時間也用一個示例MVC解決方案在我的通用存儲庫上寫了一篇文章。 http://blog.staticvoid.co.nz/2011/10/13/staticvoid_repository_pattern-nuget –