【问题标题】:C# interpret my query as inner join instead of left outer join on what cases this occurs?C# 将我的查询解释为内连接而不是左外连接,在什么情况下会发生这种情况?
【发布时间】:2014-10-31 09:45:36
【问题描述】:

我的 MVC 应用程序中有两个不同的查询。这两个查询都会在 LINQPAD 中产生预期的结果。但是我的一个查询不会产生左外连接结果;相反,它产生内部连接结果,其中左表中的空记录被消除并产生其他记录。

我的查询看起来像

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"

我想知道这是什么情况?

我的另一个查询我没有分配可为空的 int?到 FK id。

【问题讨论】:

  • 请更合理地格式化 SQL 查询 - 它现在难以置信难以阅读。 (只需用真正的换行符替换每个“\r\n”就是一个好的开始。)
  • 如果你给出一个最小的例子也会有所帮助,例如在每个只有几个属性的表之间。
  • stackoverflow.com/questions/700523/linq-to-sql-left-outer-join 试试 Amir 的第二个答案,它应该可以工作并且语法更令人愉快
  • @Aymeric 我查看了 Amirs 的答案,但它没有帮助,我只想知道我写了一个 linq 查询来执行左外连接,但 c# 将查询解释为内部,它产生 o/p基于右表,我在左表中的空记录未显示,但相同的查询在 linqpad 中产生预期结果,而不是在 VS2013 中

标签: c# linq linq-to-sql left-join linqpad


【解决方案1】:

只需将代码更改为

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
        }

【讨论】:

  • 不是从 sp 你应该从 subsp 中获取它与 SalesPersons 中的 sp 不同
猜你喜欢
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
相关资源
最近更新 更多