为什么此linq查询创建内部联接而不是左联接

时间:2019-12-03 17:10:56

标签: linq-to-entities

在此linq查询中,我希望它在ApprovedBy列和ApprovedByTeUserId列上创建左联接。当我写出查询时,它只是结束了ApprovedBy字段的常规内部联接,甚至没有将TEEmployees表作为另一个左联接。

.toolbar > * {
flex-grow:1
}

产生的sql查询就是这个。

var approvedTimesheets = (from t in cdc.ContractJobTimesheetSummaries
join c in cdc.ContractJobs on t.ContractJobId equals c.ContractJobID
join p in cdc.People on c.ContractorID equals p.PeopleID 
join p2 in cdc.People on t.ApprovedBy equals p2.PeopleID into clientApprover 
from ca  in clientApprover.DefaultIfEmpty()
join te in cdc.TEEmployees on t.ApprovedByTeUserId equals te.ID into teApprover 
from te in teApprover.DefaultIfEmpty()

  where jobIds.Contains(t.ContractJobId)
  select new
  {
      t.WeekEnding,
      p.FirstName,
      p.LastName,
      c.PositionTitle,
      t.ApprovedDateTime,
      t.TotalMins,
      t.ContractJobId,
      ClientApprover = ca.FirstName + " " + ca.LastName
  });

在另一个类中,我有一个几乎相同的查询,但具有不同的起始表,并且工作正常。我不知道为什么一个人的行为与另一个人不同。任何想法有什么问题吗?这是生成两个左联接的查询。

SELECT 
[Project1].[TotalMins] AS [TotalMins], 
[Project1].[WeekEnding] AS [WeekEnding], 
[Project1].[FirstName] AS [FirstName], 
[Project1].[LastName] AS [LastName], 
[Project1].[PositionTitle] AS [PositionTitle], 
[Project1].[ApprovedDateTime] AS [ApprovedDateTime], 
[Project1].[ContractJobId] AS [ContractJobId], 
[Project1].[C1] AS [C1]
FROM ( SELECT 
    [Extent1].[ContractJobId] AS [ContractJobId], 
    [Extent1].[WeekEnding] AS [WeekEnding], 
    [Extent1].[TotalMins] AS [TotalMins], 
    [Extent1].[ApprovedDateTime] AS [ApprovedDateTime], 
    [Extent2].[PositionTitle] AS [PositionTitle], 
    [Extent3].[FirstName] AS [FirstName], 
    [Extent3].[LastName] AS [LastName], 
    [Extent4].[FirstName] + N' ' + [Extent4].[LastName] AS [C1]
    FROM    [dbo].[ContractJobTimesheetSummary] AS [Extent1]
    INNER JOIN [dbo].[ContractJob] AS [Extent2] ON [Extent1].[ContractJobId] = [Extent2].[ContractJobID]
    INNER JOIN [dbo].[People] AS [Extent3] ON [Extent2].[ContractorID] = [Extent3].[PeopleID]
    INNER JOIN [dbo].[People] AS [Extent4] ON [Extent1].[ApprovedBy] = [Extent4].[PeopleID]
    WHERE [Extent1].[ContractJobId] IN (cast(16243 as decimal(18)), cast(16472 as decimal(18)))
)  AS [Project1]

0 个答案:

没有答案
相关问题