警告说 Linq-To-Sql 表达式总是错误的,但这是不正确的,为什么?

Warning says Linq-To-Sql Expression is always false, but this is incorrect, why?

我在下面代码的注释中指出的行中收到警告。我正在使用 Visual Studio 2015。我在数据库中有 2 个表,并使用 Linq-2-Sql 查询它们。 Linq 代码在 companyID 上的两个表之间执行左连接。

当运行时,left join 运行s如预期,我得到了TestTable1中的所有值,但只有在companyIds匹配的TestTable2中记录。

如果下面的警告是正确的并且表达式始终为假,则字符串 "NULL" 将永远不会分配给 value1。事实并非如此,因为当我 运行 时,我得到 "NULL" 正是执行左连接时预期的时间。

我在我的代码中的很多地方都使用了这种模式,这些警告无处不在,但我的代码在我所做的 NULL 检查中运行良好。这个警告对我来说似乎是错误的。我在这里遗漏了什么吗?

t2.CompanyId是一个INT类型的数据库字段。以及 linq-2-sql class 中的 int 数据类型,但在查询中仍以某种方式分配了 null。

    var db = new SandBoxDataContext();

    var result = (from t1 in db.TestTable1s

                  from t2 in db.TestTable2s
                    .Where(x => x.CompanyId == t1.CompanyId)
                    .DefaultIfEmpty()

                  select new
                  {
                      //t2.CompanyId == null in line below is underlined with the warning!
                      value1 = t2.CompanyId == null ? "NULL" : "INT"

                  }).ToList();

    foreach (var rec in result)
    {
        Response.Write("value1 = " + rec.value1 + "<br>");
    }

这是警告

CS0472  The result of the expression is always 'false' since a value of type 'int' is never equal to 'null' of type 'int?'

下面是生成的SQL

SELECT 
    (CASE 
        WHEN ([t1].[CompanyId]) IS NULL THEN 'NULL'
        ELSE CONVERT(NVarChar(4),'INT')
     END) AS [value1]
FROM [dbo].[TestTable1] AS [t0]
LEFT OUTER JOIN [dbo].[TestTable2] AS [t1] ON [t1].[CompanyId] = [t0].[CompanyId]

警告是因为比较任何 int 表达式与 null 总是 false.

这在查询表达式中可能不同。提供者可以翻译成任何它喜欢的东西。显然,尽管这是一个查询,但 C# 编译器仍然选择警告您。

我不知道 L2S 将其翻译成什么。你说它有效,显然翻译做了你想要的,警告是误报。

我建议您将其重写为一种形式,使警告消失并增加过程中代码的直观性:

value1 = t2 == null ? "NULL" : "INT"