2013-04-08 5 views
9

Мне нужно написать состояние Linq-объект, который может получить ниже SQL запросLinq к Entity Присоединиться таблицей с несколькими или условиями

SELECT RR.OrderId 
FROM dbo.TableOne RR 
     JOIN dbo.TableTwo M ON RR.OrderedProductId = M.ProductID OR RR.SoldProductId= M.ProductID 
WHERE RR.StatusID IN (1, 4, 5, 6, 7) 

Я застрял с синтаксисом ниже

int[] statusIds = new int[] { 1, 4, 5, 6, 7 }; 
      using (Entities context = new Entities()) 
      { 
       var query = (from RR in context.TableOne 
          join M in context.TableTwo on new { RR.OrderedProductId, RR.SoldProductId} equals new { M.ProductID } 
          where RR.CustomerID == CustomerID 
          && statusIds.Any(x => x.Equals(RR.StatusID.Value)) 
          select RR.OrderId).ToArray(); 
      } 

это приводит к ошибке ниже

Ошибка 50 Тип одного из выражений в предложении соединения неверен. Ошибка ввода типа в вызове «Join».

Как выполнить объединение нескольких условий для таблицы.

ответ

21

Вам не нужно использовать синтаксис соединения. Добавление предикатов в предложении where имеет тот же эффект, и вы можете добавить несколько условий:

var query = (from RR in context.TableOne 
      from M in context.TableTwo 
      where RR.OrderedProductId == M.ProductID 
        || RR.SoldProductId == M.ProductID // Your join 
      where RR.CustomerID == CustomerID 
        && statusIds.Any(x => x.Equals(RR.StatusID.Value)) 
      select RR.OrderId).ToArray(); 
+0

Хорошо, что это сработало. Я смотрел на SO и нашел что-то вроде того, где RR.OrderedProductId/RR.SoldProductId равен M.ProductID, но это не сработало для моего кода. – HaBo

7

Поменяйте свой синтаксис запроса с использованием join с использованием дополнительного from пункта

var query = (from RR in context.TableOne 
       from M in context.TableTwo.Where(x => x.ProductID == RR.OrderedProductId || x.ProductID == RR.SoldProductId) 
       where statusIds.Any(x => x.Equals(RR.StatusID.Value)) 
       select RR.OrderId).ToArray(); 
+0

Ваши оба ответа работали для меня. Извините, я могу выбрать только один ответ. Поэтому я даю вам голосование и выбирая @gert Arnold в качестве ответа – HaBo

2

несколько объединениями:

var query = (from RR in context.TableOne 
      join M in context.TableTwo on new { oId = RR.OrderedProductId, sId = RR.SoldProductId} equals new { oId = M.ProductID, sId = M.ProductID } 
      where RR.CustomerID == CustomerID 
      && statusIds.Any(x => x.Equals(RR.StatusID.Value)) 
      select RR.OrderId).ToArray(); 
Смежные вопросы