为什么当我放置 && 条件时,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
.
我喜欢像下面这样生成左外连接查询,但不知何故当我添加
&& 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
.