2014-05-05 28 views
1

面對什麼感覺像一個小挑戰。我試圖從<服務>和< BlacklistedServices>類型的兩個不同模型中檢索對象集合,類型爲< ServicesViewModel>。實體框架Select Logic with Logic

第一類:<服務>,稱之爲服務。 (顯示在第二個代碼示例中)

第二種:輸入< BlacklistedServices>,稱之爲BlacklistedServices。

Dim BlacklistedServices As IQueryable(Of Models.BlacklistedServices) = unitOfWork.AutoServiceBlackList.GetAll() 

這兩個集合之間的關係如下。列入黑名單的某些服務作爲黑名單服務中的記錄存在。

以下就是我想實現:

  1. 創建所有服務的集合,並且:
    1. 如果某個服務的紀錄BlacklistedServices存在,然後設置相應的屬性「黑名單」爲真。
    2. 如果服務記錄存在於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邏輯?

一如既往,任何和所有的幫助表示讚賞!

+0

如果兩個查詢都具有相同的上下文,則可以用'BlacklistedServices.FirstOrDefault(Function(BLS)BLS.ServiceName = service.Name)替換整個If語句,因爲它被轉換爲SQL,不作爲VB執行。 –

回答

4

我一直在使用MySQL與EF淨連接器和所遇到的一些奇怪的情況下非常類似LINQ語句的工作,在別人不一樣。特別是當涉及其他lambda表達式中的FirstOrDefault時。這或許是

.Enforced = If(BlacklistedServices.Any(Function(BLS) BLS.ServiceName = service.Name), 
      BlacklistedServices.Where(Function(BLS) BLS.ServiceName service.Name).FirstOrDefault().Enforced, False) 

,或者甚至

.Enforced = BlacklistedServices.Any(Function(BLS) BLS.ServiceName = service.Name) AndAlso BlacklistedServices.Where(Function(BLS) BLS.ServiceName service.Name).FirstOrDefault().Enforced 
+2

添加.Where().FirstOrDefault()工作! 現在,如果我們只知道爲什麼?大聲笑。 – Ealianis

0

嘗試考慮聲明可爲空的中間(可能是匿名)類型Enforced屬性。 所以你可以這樣寫:

Services= uow.Services.GetAll() 
    .Select(Function(service) New ServiceIntermediateViewModel() With { 
     .ServiceID = service.ServiceID, 
     .PropertyABC = service.ABC, 
     .PropertyDEF = service.DEF. 
     .Blacklisted = BlacklistedServices.Any(Function(BLS) BLS.ServiceName = service.Name), 
     .Enforced = BlacklistedServices.FirstOrDefault(Function(BLS) BLS.ServiceName service.Name).Enforced 
    }) 
    .Select(Function(service) New ServiceViewModel() With { 
     .ServiceID = service.ServiceID, 
     .PropertyABC = service.PropertyABC, 
     .PropertyDEF = service.PropertyDEF. 
     .Blacklisted = service.Blacklisted, 
     .Enforced = If(service.Blacklisted, 
      service.Enforced, False) 
    }).ToList() 
0

我有同樣的問題,並根據Ealianis評論由

.Where(y => y.value == rule).FirstOrDefault(); 

更換

.FirstOrDefault(y => y.value == rule); 

。解決了我的問題