面對什麼感覺像一個小挑戰。我試圖從<服務>和< BlacklistedServices>類型的兩個不同模型中檢索對象集合,類型爲< ServicesViewModel>。實體框架Select Logic with Logic
第一類:<服務>,稱之爲服務。 (顯示在第二個代碼示例中)
第二種:輸入< BlacklistedServices>,稱之爲BlacklistedServices。
Dim BlacklistedServices As IQueryable(Of Models.BlacklistedServices) = unitOfWork.AutoServiceBlackList.GetAll()
這兩個集合之間的關係如下。列入黑名單的某些服務作爲黑名單服務中的記錄存在。
以下就是我想實現:
- 創建所有服務的集合,並且:
- 如果某個服務的紀錄BlacklistedServices存在,然後設置相應的屬性「黑名單」爲真。
- 如果服務記錄存在於BlacklistedServices中,那麼確定相應的黑名單服務記錄的「強制」屬性設置爲什麼,並將相應的屬性「強制」設置爲任何值。
我已經完成了大部分工作。我被部分(1.2)卡住了。
以下是我的工作代碼:
Services= uow.Services.GetAll().Select(Function(service) New ServiceViewModel() With
{.ServiceID = service.ServiceID,
.PropertyABC= service.ABC,
.PropertyDEF= service.DEF.
.Blacklisted = BlacklistedServices.Any(Function(BLS) BLS.ServiceName = service.Name),
.Enforced = If(BlacklistedServices.Any(Function(BLS) BLS.ServiceName = service.Name),
BlacklistedServices.FirstOrDefault(Function(BLS) BLS.ServiceName service.Name).Enforced, False)}).ToList()
它完美,除了試圖設置在視圖模型的.Enforced財產時。
.Enforced = If(BlacklistedServices.Any(Function(BLS) BLS.ServiceName = service.Name),
BlacklistedServices.FirstOrDefault(Function(BLS) BLS.ServiceName service.Name).Enforced, False)}).ToList()
錯誤返回如下:
System.Data.EntityCommandCompliationException:{ 「同時準備命令定義時發生錯誤 參見內部異常 的信息。」}的InnerException: { 「無法轉換的類型 'MySql.Data.Entity.SelectStatement' 對象鍵入 'MySql.Data.Entity.LiteralFragment'。」}
這個問題似乎是在嘗試使用邏輯(一個If)時。大多數情況下,我不認爲這會是一個問題,當構建一個新的對象,並確定什麼作爲參數傳入;然而,這或多或少被轉換爲必須發送到服務器的IQueryable表達式樹。所以也許實體框架不能將邏輯轉換爲SQL邏輯?
一如既往,任何和所有的幫助表示讚賞!
如果兩個查詢都具有相同的上下文,則可以用'BlacklistedServices.FirstOrDefault(Function(BLS)BLS.ServiceName = service.Name)替換整個If語句,因爲它被轉換爲SQL,不作爲VB執行。 –