2015-10-29 4 views
1

Предположим, у меня есть коллекции Order and OrderDetails. Как написать следующий sql в LINQ (запрос или свободный синтаксис)?LINQ Условный составной ключ в INNER JOIN

выберите верхний 1 OD.ProductId
от заказа O
внутреннее соединение OrderDetail OD на OD.OrderID = 1
и OD.OrderId = O.OrderId
и ((= O OD.OrderDate .OrderDate) или (OD.OrderDate равно нулю))
где O.CustomerId = 2
упорядочить по алфавиту OD.OrderDate

Я знаю, что я могу создать анонимный тип, содержащий все столбцы подстать присоединиться, однако, как я могу написать условную логику для внутреннего соединения, как указано выше в BOLD

+1

Он не должен быть частью соединения. Вы можете написать простой «Где». –

+0

Привет, Герт. Можете ли вы предоставить пример кода, пожалуйста? –

+0

@SyedDanish: Это должно быть тривиальное преобразование запросов, поэтому трудно понять, с чем вам трудно. Можете ли вы показать нам код LINQ, который вы уже написали, и с какой конкретной проблемой вы сталкиваетесь? – StriplingWarrior

ответ

3

Ваш запрос будет давать те же результаты, как:

select top 1 OD.ProductId 
from Order O 
inner join OrderDetail OD 
    on OD.OrderId = O.OrderId 
where O.CustomerId = 2 
    and OD.OrderID=1 
    and (OD.OrderDate is null or OD.OrderDate=O.OrderDate) 
order by OD.OrderDate desc 

Вы должны быть в состоянии преобразовать это в LINQ намного проще.

var results=db.OrderDetail 
    .Where(od=>od.Order.CustomerId==2) 
    .Where(od=>od.OrderId==1) 
    .Where(od=>od.OrderDate==null || od.OrderDate==od.Order.OrderDate) 
    .OrderBy(od=>od.OrderDate) 
    .Select(od=>od.ProductId) 
    .First(); 

Вы можете еще больше упростить, что:

var results=db.OrderDetail 
    .Where(od=>od.Order.CustomerId==2 && 
    (od.OrderId==1) && 
    (od.OrderDate==null || od.OrderDate==od.Order.OrderDate)) 
    .OrderBy(od=>od.OrderDate) 
    .Select(od=>od.ProductId) 
    .First(); 
+0

Привет, Роберт, спасибо. Я принимаю ваш ответ так, как это правильно для сценария, который я упомянул, но мне все еще интересно узнать, как мы можем записать эквивалент LINQ для ситуаций, когда условная логика является частью условия «Присоединение» и не может быть записана в разделе «Где». вероятно, я должен задать другой вопрос с конкретным примером кода. –

+1

@SyedDanish Я думаю, вам будет трудно найти такой пример, однако альтернативой является объединение двух отдельных запросов вместе с одной частью «или». –