为什么当我放置 && 条件时,lambda 表达式将 LEFT JOIN 更改为 INNER JOIN?

Why the lambda expression change LEFT JOIN TO INNER JOIN When i put && condition?

我喜欢像下面这样生成左外连接查询,但不知何故当我添加

&& o.sgd.intStoreGroup==intStoreGroup

进入 lambda 表达式,它从 LEFT JOIN 变为 INNER JOIN。

下面的lamdba表达式有错误吗?为什么会改变?那我怎么解决呢?

型号

public partial class Partner_StoreTbl  
 {
        [Key]
        public int intStore { get; set; }
        public int intPartner { get; set; }
        public string varStoreRef { get; set; } 
        public byte tintStatus { get; set; }
 }

 public partial class Partner_StoreGroupDetailTbl 
{
    [Key]
    public int intStoreGroupDetail { get; set; }
    public int intStoreGroup { get; set; } 
    public int intStore { get; set; }

}

LINQ

List<byte> byteValue = new List<byte> { 1 };


var StoreGroupDetail = Partner_StoreTbl.GroupJoin(Partner_StoreGroupDetailTbl, s => s.intStoreRef, sgd => sgd.intStore, (s, sgd) => new { s, sgd })
    .Where(o=>o.s.intPartner==intPartner)
    .SelectMany(o => o.sgd.DefaultIfEmpty(), (s,sgd) => new { s.s,sgd}) 
    .Where(o => byteValue.Contains( o.s.tintStatus ) &&  o.sgd.intStoreGroup==intStoreGroup)
    .Select(o => new MODELS.ViewModels.Partner.StoreGroupDetail
    {
        intStoreRef = o.s.intStoreRef,
        intStoreGroup = o.sgd.intStoreGroup==null?0:o.sgd.intStoreGroup,


    }).ToList();

TSQL 我想要 LINQ 生成

SELECT 
    [Extent1].[intStoreRef] AS [intStoreRef], 
    [Extent2].[intStoreGroup] AS [C1]
FROM  [dbo].[Partner_StoreTbl] AS [Extent1]
LEFT JOIN [dbo].[Partner_StoreGroupDetailTbl] AS [Extent2] ON [Extent1].[intStoreRef] = [Extent2].[intStore]  
    AND  [Extent2].[intStoreGroup] = 1
 WHERE ([Extent1].[intPartner] = 1) AND ([Extent1].[tintStatus] IN (cast(1 as tinyint))) 

但不知怎么我明白了

SELECT 
    [Extent1].[intStoreRef] AS [intStoreRef], 
    [Extent2].[intStoreGroup] AS [C1]
FROM  [dbo].[Partner_StoreTbl] AS [Extent1]
INNER JOIN [dbo].[Partner_StoreGroupDetailTbl] AS [Extent2] ON [Extent1].[intStoreRef] = [Extent2].[intStore]
WHERE ([Extent1].[intPartner] = @1) AND ([Extent1].[tintStatus] IN (cast(1 as tinyint))) AND ([Extent2].[intStoreGroup] = @1) 

为了

.GroupJoin(Partner_StoreGroupDetailTbl, s => s.intStoreRef, sgd => sgd.intStore, (s, sgd) => new { s, sgd })

你或许应该试试

.GroupJoin(Partner_StoreGroupDetailTbl, s => new { intStore = s.intStoreRef, intStoreGroup = intStoreGroup }, sgd => new { intStore = sgd.intStore, sgd.intStoreGroup }, (s, sgd) => new { s, sgd })

然后去掉条件&& o.sgd.intStoreGroup==intStoreGroup

但是你必须用 EF/Linq-to-SQL

来测试它

关于为什么...我不知道为什么,但我可以告诉你:

 SELECT * FROM A LEFT JOIN B ON something WHERE B.Something = C

相当于

 SELECT * FROM A INNER JOIN B ON something WHERE B.Something = C

因为 WHERE B.Something = C 强烈暗示 B.Something IS NOT NULL,并且强烈暗示 B 已经 "found"。因此,如果 B 不是 "found",则 WHERE "fails" 和该行无法返回。就像 INNER JOIN.