我對可能有用的重用模式感到好奇,並希望看看其他人是否嘗試過。基本上我有這些例如標準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。
所以,你想一個通用的方法返回通過傳遞過濾器/ where子句來列出未知類型的實體? – DavidG
類別。在我的希望中,我可以讓func說出像tdType,teCategory等上下文對象...繼續成爲函數被接受,但是我的使用總是被諸如此類的東西阻止:「你不能將它轉換成這個」。基本上,這是一堆'GetAll'返回,其中唯一的變量是輸入和輸出。有時他們可能有一個Where子句,但並非總是如此。 – djangojazz
「實體生成對象」是什麼意思?目前尚不清楚。 – DavidG