2016-08-23 1 views
1

У меня есть две таблицы, имеющие 1-к-многим: WorkOrder 1 - * ServiceКак выполнить левое соединение при соединении поле равно нулю или 0

Они имеют отношение через поле: ServiceID

Из-за некоторые унаследованные причины, есть некоторые WorkOrder не имеет Service, но его ServiceID поля сохраняются как 0


Теперь я хочу, чтобы выбрать все WorkOrdersтогда и только тогда

Существует согласующим Service ИЛИ WorkOrder «s ServiceID = 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 где 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, потому что первое условие, и он не хочет сопоставления в этом случае , Таким образом '' 'никогда не будет пустым для этих записей с этим кодом. Возможно, назначение должно быть 'ServiceCode = wo.ServiceId == null || wo.ServiceId == 0? string.empty: ...... ' – Rumpelstinsk

+0

Может быть, Румпельстинск прав. Я попробовал это и, кажется, выбирает слишком много записей ... Спасибо за быстрый ответ. – shole

+0

@shole - Проверить обновление пожалуйста :) –

0

Без ServiceID = 0, это должно быть нормальное левое соединение

По определению left outer join incudes каждые запись с левой стороны независимо от того, имеется ли соответствующая правая сторона записи.

Поскольку ваш WorkOrder находится в левой части соединения, вы должны использовать нормальное левое соединение независимо от вашего «нового требования».

 Смежные вопросы

  • Нет связанных вопросов^_^