2014-10-31 2 views
0

У меня есть два разных запроса в моем приложении MVC. Оба запроса дают ожидаемый результат в LINQPAD. Но один из моих запросов не приводит к левому внешнему соединенному результату; вместо этого он производит результат внутреннего соединения, где нулевая запись в левой таблице исключается и создает другие записи.C# интерпретировать мой запрос как внутреннее соединение вместо левого внешнего соединения в каких случаях это происходит?

мой запрос выглядит

var query = from inq in Inquiries 
join sp in SalesPersons on inq.AssignedToID equals (int?)sp.SalesPersonID 
into inquirySalesJoin 
from sp in inquirySalesJoin.DefaultIfEmpty() 
where (!inq.Deleted) 
select new 
{ 
InquiryID = inq.InquiryID, 
NameFirst = inq.NameFirst, 
Salutation = inq.SalutationID, 
NameLast = inq.NameLast, 
AssignedToID = inq.AssignedToID, 
AssignedToDescription = (inq.AssignedToID == null ? "Not Assigned" : ((sp.NameFirst == null ? "" : sp.NameFirst) + " " + (sp.NameLast == null ? "" : sp.NameLast))), 
InquiryStatus = inq.InquiryStatus 
} 

когда я конвертировать конвертировать мой запрос в строку SQL-оператор производства не содержит каких-либо внешнего соединения метод, где он фактически выполняет внутреннее соединение

"SELECT 
[Project1].[InquiryID] AS [InquiryID], 
[Project1].[NameFirst] AS [NameFirst], 
[Project1].[SalutationID] AS [SalutationID], 
[Project1].[NameLast] AS [NameLast], 
[Project1].[CompanyName] AS [CompanyName], 
[Project1].[JobTitle] AS [JobTitle], 
[Project1].[TelePhone] AS [TelePhone], 
[Project1].[Email] AS [Email], 
[Project1].[InterestedProductID] AS [InterestedProductID], 
[Project1].[Others] AS [Others], 
[Project1].[ReferedBy] AS [ReferedBy], 
[Project1].[Comments] AS [Comments], 
[Project1].[AssignedToID] AS [AssignedToID], 
[Project1].[C1] AS [C1], 
[Project1].[InquiryStatus] AS [InquiryStatus] 
FROM (SELECT 
    [Extent1].[InquiryID] AS [InquiryID], 
    [Extent1].[NameLast] AS [NameLast], 
    [Extent1].[NameFirst] AS [NameFirst], 
    [Extent1].[CompanyName] AS [CompanyName], 
    [Extent1].[JobTitle] AS [JobTitle], 
    [Extent1].[TelePhone 
] AS [TelePhone], 
    [Extent1].[Email] AS [Email], 
    [Extent1].[InterestedProductID] AS [InterestedProductID], 
    [Extent1].[Others] AS [Others], 
    [Extent1].[ReferedBy] AS [ReferedBy], 
    [Extent1].[Comments] AS [Comments], 
    [Extent1].[AssignedToID] AS [AssignedToID], 
    [Extent1].[InquiryStatus] AS [InquiryStatus], 
    [Extent1].[SalutationID] AS [SalutationID], 
    CASE WHEN ([Extent2].[NameFirst] IS NULL) THEN N'' ELSE [Extent2].[NameFirst] END + N' ' + CASE WHEN ([Extent2].[NameLast] IS NULL) THEN N'' ELSE [Extent2].[NameLast] END AS [C1] 
    FROM [DBO].[Inquiry] AS [Extent1] 
    INNER JOIN [DBO].[SalesPerson] AS [Extent2] ON [Extent1].[AssignedToID] = [Extent2].[SalesPersonID] 
    WHERE [Extent1].[Deleted] <> cast(1 as bit) 
) AS [Project1] 
ORDER BY [Project1].[InquiryID] ASC" 

I Интересно, в каких случаях это происходит?

Мой другой запрос Я не назначаю nullable int? к идентификатору FK.

+1

Пожалуйста, форматировать запрос SQL более здраво - это * невероятно * трудно читать прямо сейчас. (Просто замена каждого «\ r \ n» на реальный разрыв строки будет хорошим началом.) –

+0

Это также помогло бы, если бы вы дали минимальный пример, например. между таблицами всего несколько свойств. –

+0

http://stackoverflow.com/questions/700523/linq-to-sql-left-outer-join Попробуйте второй ответ от Амира, он должен работать, и синтаксис более приятный – Aymeric

ответ

0

Просто измените код в

var query = from inq in Inquiries 
     join sp in SalesPersons on inq.AssignedToID equals (int?)sp.SalesPersonID 
     into inquirySalesJoin 
     from subsp in inquirySalesJoin.DefaultIfEmpty() 
     where (!inq.Deleted) 
     select new 
     { 
     InquiryID = subsp.InquiryID, 
     NameFirst = subsp.NameFirst, 
     Salutation = subsp.SalutationID, 
     NameLast = subsp.NameLast, 
     AssignedToID = subsp.AssignedToID, 
     AssignedToDescription = (subsp.AssignedToID == null ? "Not Assigned" : ((subsp.NameFirst == null ? "" : subsp.NameFirst) + " " + (subsp.NameLast == null ? "" : subsp.NameLast))), 
     InquiryStatus = subsp.InquiryStatus 
     } 
+0

Что вы изменили? – rdans

+0

Не из sp вы должны взять его из подстраницы не то же самое с sp в SalesPersons – cCcik