"NOT EXIST" SQL 相当于 LINQ
"NOT EXIST" SQL equivalent to LINQ
SQL 语句:
SELECT
LTRIM(RTRIM([t0].[Whd_WHNo])) AS [RR_number],
[t0].[Whd_WHSeqNo] AS [SequenceNo],
[t0].[Whd_WHSplitSeqNo] AS [SplitSequenceNo],
LTRIM(RTRIM([t3].[Saw_StockName])) AS [ItemName],
LTRIM(RTRIM([t3].[Saw_StockSpecs1])) AS [AssetDescription],
[t4].[Scm_SubsidiaryTitle] AS [SubsidiaryTitle],
[t0].[Whd_WHIssuedQty] AS [QuantityAsset],
LTRIM(RTRIM([t4].[Scm_FixedAssetAccountCode])) AS [AccountCodeFAInvest],
LTRIM(RTRIM([t5].[Asm_AssetCategoryID])) AS [AssetCategoryID],
[t1].[Whh_SubsidiaryCode] AS [SubsidiaryCode],
[t4].[Scm_SubsidiaryClass] AS [SubsidiaryClass],
[t4].[Scm_SubsidiaryType] AS [SubsidiaryType],
[t0].[Whd_StockCode] AS [StockCode]
FROM
[dbo].[E_WHDetailEntry] AS [t0]
INNER JOIN
[dbo].[E_WHHeaderEntry] AS [t1] ON [t0].[Whd_WHNo] = [t1].[Whh_WHNo]
AND ([t0].[Whd_WHSeqNo] = [t1].[Whh_WHSeqNo])
AND ([t0].[Whd_WHSplitSeqNo] = [t1].[Whh_WHSplitSeqNo])
INNER JOIN
[dbo].[E_StockAndWorkMaster] AS [t3] ON [t0].[Whd_StockCode] = [t3].[Saw_StockCode]
INNER JOIN
[dbo].[T_SubsidiaryCodeMaster] AS [t4] ON [t1].[Whh_SubsidiaryCode] = [t4].[Scm_SubsidiaryCode]
LEFT OUTER JOIN
[dbo].[E_AssetCategoryMaster] AS [t5] ON [t4].[Scm_FixedAssetAccountCode] = [t5].[Asm_AccountCodeFAInvest]
WHERE
([t0].[Whd_StockType] = 'FS2')
AND ([t1].[Whh_SubsidiaryCode] = '21Y-003')
AND NOT EXISTS (SELECT * FROM [dbo].[E_AssetRegistry] AS [t2]
WHERE [t0].[Whd_WHNo] = [t2].[Are_RRNo]
AND [t0].[Whd_WHSeqNo] = [t2].[Are_RRSeqNo]
AND [t0].[Whd_WHSplitSeqNo] = [t2].[Are_RRSplitSeqNo])
ORDER BY
[t0].[Whd_WHNo]
我尝试使用 DefaultIfEmpty()
,因为这在某种程度上相当于 SQL 中的 Left Outer Join,但它不会显示正确的输出。
LINQ:
var list = (from x in ctx.DataContext.E_WHDetailEntries
join y in ctx.DataContext.E_WHHeaderEntries on x.Whd_WHNo equals y.Whh_WHNo
where x.Whd_WHSeqNo == y.Whh_WHSeqNo && x.Whd_WHSplitSeqNo == y.Whh_WHSplitSeqNo
join z in ctx.DataContext.E_StockAndWorkMasters on x.Whd_StockCode equals z.Saw_StockCode
join a in ctx.DataContext.T_SubsidiaryCodeMasters on y.Whh_SubsidiaryCode equals a.Scm_SubsidiaryCode
join b in ctx.DataContext.AssetCategoryEntities on a.Scm_FixedAssetAccountCode equals b.AccountCodeFAInvest
into g
from b in g.DefaultIfEmpty()
where x.Whd_StockType == "FS2" && y.Whh_SubsidiaryCode == strBudgetCode.Trim()
//not Include Already Generated AssetCode
join c in ctx.DataContext.AssetRegistryEntities on x.Whd_WHNo equals c.RRNumber
into h
from c in h.DefaultIfEmpty()
if notexist
where x.Whd_WHSeqNo == c.RRSeqNumber && x.Whd_WHSplitSeqNo == c.RRSplitSeqNo
//--end
orderby x.Whd_WHNo
select new AssetGenerationTemplate()
{
IsSelected= false,
RR_number = x.Whd_WHNo.Trim(),
SequenceNo = x.Whd_WHSeqNo,
SplitSequenceNo = x.Whd_WHSplitSeqNo,
ItemName = z.Saw_StockName.Trim(),
AssetDescription = z.Saw_StockSpecs1.Trim(),
QuantityAsset = x.Whd_WHIssuedQty,
SubsidiaryCode = y.Whh_SubsidiaryCode,
AccountCodeFAInvest = a.Scm_FixedAssetAccountCode.Trim(),
AssetCategoryID = b.AssetCategoryID.Trim(),
SubsidiaryClass = a.Scm_SubsidiaryClass,
SubsidiaryType = a.Scm_SubsidiaryType,
SubsidiaryTitle = a.Scm_SubsidiaryTitle,
StockCode = x.Whd_StockCode
}
).ToList();
List = list.OrderBy(x => x.SequenceNo).ToList();
return List;
您可能需要这部分:
...
where !ctx.E_AssetRegistry.Any(t2 => x.Whd_WHNo == t2.Are_RRNo
&& x.Whd_WHSeqNo == t2.Are_RRSeqNo
&& x.Whd_WHSplitSeqNo = t2.Are_RRSplitSeqNo)
...
SQL 语句:
SELECT
LTRIM(RTRIM([t0].[Whd_WHNo])) AS [RR_number],
[t0].[Whd_WHSeqNo] AS [SequenceNo],
[t0].[Whd_WHSplitSeqNo] AS [SplitSequenceNo],
LTRIM(RTRIM([t3].[Saw_StockName])) AS [ItemName],
LTRIM(RTRIM([t3].[Saw_StockSpecs1])) AS [AssetDescription],
[t4].[Scm_SubsidiaryTitle] AS [SubsidiaryTitle],
[t0].[Whd_WHIssuedQty] AS [QuantityAsset],
LTRIM(RTRIM([t4].[Scm_FixedAssetAccountCode])) AS [AccountCodeFAInvest],
LTRIM(RTRIM([t5].[Asm_AssetCategoryID])) AS [AssetCategoryID],
[t1].[Whh_SubsidiaryCode] AS [SubsidiaryCode],
[t4].[Scm_SubsidiaryClass] AS [SubsidiaryClass],
[t4].[Scm_SubsidiaryType] AS [SubsidiaryType],
[t0].[Whd_StockCode] AS [StockCode]
FROM
[dbo].[E_WHDetailEntry] AS [t0]
INNER JOIN
[dbo].[E_WHHeaderEntry] AS [t1] ON [t0].[Whd_WHNo] = [t1].[Whh_WHNo]
AND ([t0].[Whd_WHSeqNo] = [t1].[Whh_WHSeqNo])
AND ([t0].[Whd_WHSplitSeqNo] = [t1].[Whh_WHSplitSeqNo])
INNER JOIN
[dbo].[E_StockAndWorkMaster] AS [t3] ON [t0].[Whd_StockCode] = [t3].[Saw_StockCode]
INNER JOIN
[dbo].[T_SubsidiaryCodeMaster] AS [t4] ON [t1].[Whh_SubsidiaryCode] = [t4].[Scm_SubsidiaryCode]
LEFT OUTER JOIN
[dbo].[E_AssetCategoryMaster] AS [t5] ON [t4].[Scm_FixedAssetAccountCode] = [t5].[Asm_AccountCodeFAInvest]
WHERE
([t0].[Whd_StockType] = 'FS2')
AND ([t1].[Whh_SubsidiaryCode] = '21Y-003')
AND NOT EXISTS (SELECT * FROM [dbo].[E_AssetRegistry] AS [t2]
WHERE [t0].[Whd_WHNo] = [t2].[Are_RRNo]
AND [t0].[Whd_WHSeqNo] = [t2].[Are_RRSeqNo]
AND [t0].[Whd_WHSplitSeqNo] = [t2].[Are_RRSplitSeqNo])
ORDER BY
[t0].[Whd_WHNo]
我尝试使用 DefaultIfEmpty()
,因为这在某种程度上相当于 SQL 中的 Left Outer Join,但它不会显示正确的输出。
LINQ:
var list = (from x in ctx.DataContext.E_WHDetailEntries
join y in ctx.DataContext.E_WHHeaderEntries on x.Whd_WHNo equals y.Whh_WHNo
where x.Whd_WHSeqNo == y.Whh_WHSeqNo && x.Whd_WHSplitSeqNo == y.Whh_WHSplitSeqNo
join z in ctx.DataContext.E_StockAndWorkMasters on x.Whd_StockCode equals z.Saw_StockCode
join a in ctx.DataContext.T_SubsidiaryCodeMasters on y.Whh_SubsidiaryCode equals a.Scm_SubsidiaryCode
join b in ctx.DataContext.AssetCategoryEntities on a.Scm_FixedAssetAccountCode equals b.AccountCodeFAInvest
into g
from b in g.DefaultIfEmpty()
where x.Whd_StockType == "FS2" && y.Whh_SubsidiaryCode == strBudgetCode.Trim()
//not Include Already Generated AssetCode
join c in ctx.DataContext.AssetRegistryEntities on x.Whd_WHNo equals c.RRNumber
into h
from c in h.DefaultIfEmpty()
if notexist
where x.Whd_WHSeqNo == c.RRSeqNumber && x.Whd_WHSplitSeqNo == c.RRSplitSeqNo
//--end
orderby x.Whd_WHNo
select new AssetGenerationTemplate()
{
IsSelected= false,
RR_number = x.Whd_WHNo.Trim(),
SequenceNo = x.Whd_WHSeqNo,
SplitSequenceNo = x.Whd_WHSplitSeqNo,
ItemName = z.Saw_StockName.Trim(),
AssetDescription = z.Saw_StockSpecs1.Trim(),
QuantityAsset = x.Whd_WHIssuedQty,
SubsidiaryCode = y.Whh_SubsidiaryCode,
AccountCodeFAInvest = a.Scm_FixedAssetAccountCode.Trim(),
AssetCategoryID = b.AssetCategoryID.Trim(),
SubsidiaryClass = a.Scm_SubsidiaryClass,
SubsidiaryType = a.Scm_SubsidiaryType,
SubsidiaryTitle = a.Scm_SubsidiaryTitle,
StockCode = x.Whd_StockCode
}
).ToList();
List = list.OrderBy(x => x.SequenceNo).ToList();
return List;
您可能需要这部分:
...
where !ctx.E_AssetRegistry.Any(t2 => x.Whd_WHNo == t2.Are_RRNo
&& x.Whd_WHSeqNo == t2.Are_RRSeqNo
&& x.Whd_WHSplitSeqNo = t2.Are_RRSplitSeqNo)
...