2017-07-28 36 views
2

我對可能有用的重用模式感到好奇,並希望看看其他人是否嘗試過。基本上我有這些例如標準EF 6.1.3回報:您是否可以在實體上下文中包裝Func <EFContext,TResult>以供重用?

private IEnumerable<TypeTran> GetTypes() 
{ 
    using (var context = new ExpensesEntities()) 
    { 
    return context.tdType.Select(x => new TypeTran(x.TypeID, x.Description)).Where(x => x.TypeId != 3); 
    } 
} 

private List<Category> GetCurrentCategories() 
{ 
    using (var context = new ExpensesEntities()) 
    { 
    return context.tdCategory.Select(x => new Category(x.CategoryID, x.Description)).ToList(); 
    } 
} 

不要太擔心TypeTran或類別。只要說他們只是POCO,可以是任何東西。他們只是抽象層的EF刪除,所以我可以在Model對象上產生更多的After Market效果,而不影響數據庫中T4生成的對象。這種模式工作正常,但還有更多的檢索方式,所以我很好奇,如果我可以這樣做:

private TReturn RunContextWithOption<TReturn>(Func<ExpensesEntities, TReturn> func) 
{ 
    using (var context = new ExpensesEntities()) 
    { 
    return func.Invoke(context); 
    } 
} 

但是當我嘗試運行它,我現在乾的語法錯誤,我也是沒有看到在沒有預先定義的情況下使用上下文的方式。

//Wrong won't run 
private List<TypeTran> GetTypes() 
{ 
    var cont = new ExpensesEntities(); 
    return RunContextWithOption<List<TypeTran>>((cont) => cont.tdType.Select(x => new TypeTran(x.TypeID, x.Description)).Where(x => x.TypeId != 3)); 

} 

所以就變成了雞還是先有蛋,我想上下文是自動帶一個助手調用,但我可以,因爲我不需要在一個ARG出現。有沒有其他人嘗試過類似的東西,使他們的回購模式只有更少的代碼行?這可能是不好的做法,但我通常只需少量代碼,並儘可能使用私有助手,而不是重複使用(var context ...)和infinitum。

+0

所以,你想一個通用的方法返回通過傳遞過濾器/ where子句來列出未知類型的實體? – DavidG

+0

類別。在我的希望中,我可以讓func說出像tdType,teCategory等上下文對象...繼續成爲函數被接受,但是我的使用總是被諸如此類的東西阻止:「你不能將它轉換成這個」。基本上,這是一堆'GetAll'返回,其中唯一的變量是輸入和輸出。有時他們可能有一個Where子句,但並非總是如此。 – djangojazz

+0

「實體生成對象」是什麼意思?目前尚不清楚。 – DavidG

回答

1

基本上這是你需要的。我已經包含一個可選Where條款,這將是非常微不足道的包括,比方說,一個OrderBy太:

public IEnumerable<TEntity> GetEntities<TEntity>(
    Expression<Func<TEntity, bool>> predicate = null) 
    where TEntity : class 
{ 
    using (var context = new ExpensesEntities()) 
    { 
     IQueryable<TEntity> data = context.Set<TEntity>(); 
     if (predicate != null) 
     { 
      data = data.Where(predicate); 
     } 

     return data.ToList(); 
    } 
} 

,並調用它是這樣的:

var diedOn = DateTime.Now.AddDays(-30); 
var zombiesOlderThan30Days = GetEntities<Zombie>(z => 
    z.Name == "Bob" && z.DiedOn > diedOn); 

var allZombies = GetnEntities<Zombie>(); 
+0

謝謝,看起來幾乎完全是我想要的,但我得到'context.Set '的錯誤。它指出:'錯誤\t CS0452 \t'TEntity'類型必須是引用類型,才能將其用作泛型類型或方法'DbContext.Set ()'中的參數'TEntity'。不知道你是否以不同的方式使用你的EF上下文。我知道我原來是從EF 4升級的,上下文設置爲'ExpensesEntities:DbContext',並且有'public virtual DbSet tdCategory {get;設置;} ... – djangojazz

+0

哎呀,鍵入它沒有確認它編譯,再試一次! – DavidG

+0

同樣的錯誤,我需要在一天中的大部分時間內消失,但是會在週末回來,並檢查這一點,看看它在哪裏。感謝迄今爲止的幫助。對不起,如果它似乎有點模糊我想要做的。你看起來像你現在擁有它的傑作。 – djangojazz

相關問題