2012-04-29 69 views
0

我由一個外鍵關係連接的兩個對象,我使用的DataModel的對象與地圖相關的對象:抓取使用LINQ和EF

事件:1 ------ *:資產

我寫了獲取所有資產,對於一個給定[eventPublicId]

List<Asset> assetList = 
    ReliableExecution.RetryWithExpression<Event, List<Asset>> 
    (u => u.FirstOrDefault(x => x.PublicId == eventPublicId).Assets.ToList()).ToList(); 

我的問題是,我不得不打電話ToList()兩次,這看起來很笨拙的查詢。此外,我不得不使用FirstOrDefault,但是當我試圖使用[Where]或其他任何東西時,它不會編譯。

有沒有其他更好的方式如何可以重寫這段代碼?

這是RetryWithExpression簽名參考:

public static TValue RetryWithExpression<T, TValue>(Func<ObjectSet<T>, TValue> func, Int32 retryInfiniteLoopGuard = 0) 
     where T : class 
+0

爲什麼你必須調用'ToList()'兩次?你得到什麼編譯器錯誤? – Slauma

+0

如果我省略了第一個Assets.ToList,我得到一個編譯錯誤:無法將lambda表達式轉換爲委託類型,因爲塊中的某些返回類型不能隱式轉換爲委託返回類型。 如果我省略了第二個ToList,在運行時我得到了連接未打開的錯誤,但這是設計。 –

回答

1

您指定func參數應該返回一個List<Asset>,所以導航屬性event.Assets不符合該法案:這是一個EntityCollection<Asset>,這是不會隱可兌換成代表退貨類型顯式轉換ToList()創建指定的類型。

技術上,擺脫ToList的,你應該使用

ReliableExecution.RetryWithExpression<Event, EntityCollection<Asset>> ... 

,但我不知道是否能夠滿足您的功能性需求。

+0

這是有道理的,但在嘗試EntityCollection後,我得到一個錯誤:「ObjectContext實例已被處置,不能再用於需要連接的操作」。這可能是由於設計原因,因爲RetryWithExpression會在返回時處理連接。 RetryWithExpression不支持不同的執行,因爲我必須做一個解決方法來集成瞬態故障處理應用程序塊,但不幸的是,它不完全支持EF,我必須明確地管理連接。看起來我必須使用ToList來完成它。謝謝! –