2016-08-23 26 views
1

我有1對多的關係,兩個表左連接:WorkOrder 1 - * Service如何執行時,加盟字段爲空或0

他們通過現場的關係:ServiceID

由於一些遺留原因,也有一些WorkOrder沒有任何Service,但其ServiceID場被保存爲0


現在我想選擇所有WorkOrdersIFF

存在匹配的Service OR WorkOrderServiceID = 0

沒有ServiceID = 0要求它應該是一個正常的左連接:

var result = from wo in WorkOrderQuery 
       join j in JobQuery on ... // join some other tables 
       join s in ServiceQuery on wo.ServiceID equals s.ServiceID into gg 
       from g in gg.DefaultIfEmpty() 
       select new 
       { 
       ServiceCode = g == null? "" : g.Code, 
       WorkOrderID = wo.WorkOrderID, 
       }; 

但我不知道當這個要求被添加時。任何建議表示讚賞。

+0

難道你不能簡單地更新錯誤的記錄?例如:'update workorder set serviceid = null where serviceid = 0;' – Rumpelstinsk

+0

不,如果可以的話,我會這樣做,但這是一個公司決定,他們應該保持不變 – shole

+0

@shole - 如果您有一個外鍵的值不' t真的映射到另一個表中的實際記錄 - >它不是一個外鍵... –

回答

1

不能完全確定,我已經瞭解,但試試這個:

var result = (from wo in WorkOrderQuery 
       join s in ServiceQuery on wo.ServiceID equals s.ServiceID into g 
       from s in g.DefaultIfEmpty() 
       where wo.ServiceID == 0 || s != null 
       select new 
       { 
        ServiceCode = s?.Code ?? string.Empty, 
        WorkOrderID = wo.WorkOrderID 
       }).ToList(); 

在測試了這樣的數據:

List<dynamic> WorkOrderQuery = new List<dynamic> 
{ 
    new { WorkOrderID = 1, ServiceID = 1 }, 
    new { WorkOrderID = 2, ServiceID = 2 }, 
    new { WorkOrderID = 3, ServiceID = 0 } 
}; 

List<dynamic> ServiceQuery = new List<dynamic> 
{ 
    new { ServiceID = 1, Code = "a" } 
}; 

並獲得WorkOrderID 1,3

+0

也許我錯了,但是WorkOrderQuery中的記錄與serviceid = 0,將匹配servicequery上的所有記錄,因爲第一個條件,並且他不希望在該案例中匹配。因此'''''那個代碼的記錄永遠不會爲空。也許這個assignement應該是'ServiceCode = wo.ServiceId == null || wo.ServiceId == 0? string.empty:......' – Rumpelstinsk

+0

也許@Rumpelstinsk是對的。我試過這個,似乎它選擇了太多的記錄...感謝您的快速回答。 – shole

+0

@shole - 請檢查更新:) –

0

沒有服務ID = 0要求它應該是一個正常的左連接

由定義left outer join包含記錄從左側無論是否有匹配的右側記錄。

由於您的WorkOrder位於連接的左側,因此無論您的「新要求」如何,都應該使用正常的左連接。

相關問題