.net - 无法让 Left JOIN linq 查询工作!

标签 .net linq linq-to-sql

我一直在查看以下帖子并尝试将其应用于我的但没有运气:
LINQ Inner-Join vs Left-Join

我有下面的查询,每次运行时都会返回 0 条记录:

        var tasks = from tt in d.luProjectTaskTypes
                    join cbt in d.CostByTasks
                      on tt.ProjectTaskTypeID equals cbt.ProjectTaskTypeID into temp
                    from cbt in temp.DefaultIfEmpty()
                    where cbt.ProposalID == Convert.ToInt32(this.StateItems["PropNumber"])  || cbt.ProposalID == null
                    select new
                    {
                        ProposalId = (cbt.ProposalID == null ? Convert.ToInt32(this.StateItems["PropNumber"]) : cbt.ProposalID),
                        TaskId = tt.ProjectTaskTypeID,
                        CostByTaskId = (cbt.CostByTaskID == null ? 0 : cbt.CostByTaskID),
                        TypeOfWork = tt.ProjectTaskType,
                        AmountRequested = (cbt.AmountRequested == null ? 0 : cbt.AmountRequested),
                        CostShare = (cbt.CostShareAmount == null ? 0 : cbt.CostShareAmount)
                    };

哪里luProjectTaskTypes是一个包含选项列表的查找表。无论 CostByTasks 中是否有匹配项,我都希望为该表中的每个条目返回一条记录。但我总是得到 0。我做错了什么?!

更新:

这是它正在生成的 SQL-
SELECT 
    (CASE 
        WHEN ([t1].[ProposalID]) IS NULL THEN @p1
        ELSE [t1].[ProposalID]
     END) AS [ProposalId], [t0].[ProjectTaskTypeID] AS [TaskId], 
    (CASE 
        WHEN ([t1].[CostByTaskID]) IS NULL THEN @p2
        ELSE [t1].[CostByTaskID]
     END) AS [CostByTaskId], [t0].[ProjectTaskType] AS [TypeOfWork], 
    (CASE 
        WHEN [t1].[AmountRequested] IS NULL THEN CONVERT(Decimal(33,4),@p3)
       ELSE CONVERT(Decimal(33,4),[t1].[AmountRequested])
     END) AS [AmountRequested], 
    (CASE 
        WHEN [t1].[CostShareAmount] IS NULL THEN CONVERT(Decimal(33,4),@p4)
        ELSE CONVERT(Decimal(33,4),[t1].[CostShareAmount])
     END) AS [CostShare]
FROM [frgprop].[luProjectTaskType] AS [t0]
LEFT OUTER JOIN [frgprop].[CostByTask] AS [t1] ON [t0].[ProjectTaskTypeID] = [t1].[ProjectTaskTypeID]
WHERE ([t1].[ProposalID] = @p0) OR (([t1].[ProposalID]) IS NULL)

最佳答案

您的问题出在 WHERE 子句中

当您对表进行 LEFT JOIN 时,这很好,但是如果您在 LEFT-JOINED 表上设置条件,它基本上会将其变成 INNER JOIN。你应该允许 Nulls 过去。

where cbt.ProposalID == Convert.ToInt32(this.StateItems["PropNumber"]) OR cbt.ProposalID is NULL

我不确定 is NULL 语法如何——也许必须是 db.null(field)等——你必须检查一下;但这个概念是有效的。

关于.net - 无法让 Left JOIN linq 查询工作!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3463337/

相关文章:

.net - GDI+实际上还是 "usable"技术吗?

c# - 如何最轻松地访问 .NET PE 文件中的特定字段?

c# - JIT 或 CLR 中可能存在的错误

c# - 检查 IEnumerable 是否少于一定数量的项目而不引起任何不必要的评估?

c# - LINQ自引用表过滤关系

C# Linq - 连接具有多个字段的表时出现问题 - 错误 CS1941

c# - Entity Framework 中 Select 和 Where 之间的区别

c# - Json.Net - 从 'ScopeId' 上的 'System.Net.IPAddress' 获取值时出错

c# - 按属性分类的正确方法

c# - 使用 LINQ to SQL 将具有外键的 Gridview 列排序到不同的实体