2015-05-20 23 views
2

我正在寫一個EF支持的存儲庫,它有一個與每個實體類型關聯的包的概念,包括它的常用子對象。例如,我有一個看起來像這樣如何構建一個允許我通過params傳入多個包含EF的函數?

private static IQueryable<Foo> GetFooPackage(Entities context) 
{ 
    return context.Foo 
     .Include(target => target.Bar) 
     .Include(target => target.FooBar) 
} 

這是所以當我跑我的「get」方法的功能,有返回數據的一致分組。但是,我希望能夠在個案的基礎上進一步擴展。我想能夠做些類似於

public static Foo GetFoo(int fooId, params Expression<Func<Foo, T>>[] extraIncludes) 
{ 
    using (Entities context = GetContext(null)) 
    { 
     IQueryable<Foo> package = GetFooPackage(context); 

     extraIncludes.ToList().ForEach(expression => package.Include(expression)); 

     return package.FirstOrDefault(target => target.FooId == fooId); 
    } 
} 

什麼讓我掛在嘴邊是T部分。我知道這個例子沒有正確引用T泛型。這只是一個例子的佔位符。我不確定如何塑造,以便我可以做我想做的事。最終,儘可能保持EF生成的SQL儘可能小而精簡。你會建議什麼?它被用在一個斷開連接的服務中,所以我不能依賴延遲加載來簡單地獲取更多數據(如果它丟失了)。一旦我獲得了數據,我就需要一次性完成,而再次獲取數據確實不切合實際。

謝謝!

+0

這似乎是你的代碼過於複雜,以使其動態。你爲什麼不爲剛纔返回的每個唯一數據集創建一個單獨的方法?然後在需要時調用這些方法? –

+1

答案很明顯,我在這裏找到它:http://stackoverflow.com/questions/26619532/how-to-include-2-navigational-properties-in-ef?rq=1 – Bigsby

+0

@CarlProthman我不知道每當出現不同的需求時,都不想制定新的方法。我喜歡儘可能使用框架功能。目的很明確,目標很簡潔,所以我不認爲這是一個問題,因爲我沒有試圖制定一個上帝的方法。我更有趣,有點尷尬,我沒有想到「對象」是答案。 Oi ... – Bigsby

回答

1
public IQueryable<T> GetAllIncluding(params Expression<Func<T, object>>[] includes) 
{ 
    var query = DbSet.AsNoTracking(); 

    query = includes.Aggregate(query, (current, includeProperty) => current.Include(includeProperty)); 

    return query; 
} 

MyGenericRepository<A>().GetAllIncluding(x=> x.B, x=> x.C).FirstOrDefault() 

答案在這裏找到:How to include 2 navigational properties in EF?

相關問題