"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)
    ...