У меня есть два разных запроса в моем приложении 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.
Пожалуйста, форматировать запрос SQL более здраво - это * невероятно * трудно читать прямо сейчас. (Просто замена каждого «\ r \ n» на реальный разрыв строки будет хорошим началом.) –
Это также помогло бы, если бы вы дали минимальный пример, например. между таблицами всего несколько свойств. –
http://stackoverflow.com/questions/700523/linq-to-sql-left-outer-join Попробуйте второй ответ от Амира, он должен работать, и синтаксис более приятный – Aymeric