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

时间:2016-03-15 22:33:34

标签: c# sql asp.net linq linq-to-sql

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

运行时,左连接按预期运行,我获取TestTable1中的所有值,但只获得testTable2中companyIds匹配的记录。

如果下面的警告是正确的并且表达式始终为false,那么字符串" NULL"永远不会被赋值给value1。事实并非如此,因为当我运行这个时,我得到了" NULL"正好在何时进行左连接。

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

t2.CompanyId是INT类型的数据库字段。以及linq-2-sql类中的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]

1 个答案:

答案 0 :(得分:3)

警告是因为将2 K 7 T 表达式与int进行比较始终为null

这在查询表达式中可能有所不同。提供商可以转换为任何喜欢的内容。显然,C#编译器选择仍然警告你,尽管这是一个查询。

我不知道L2S将其转化为什么。你声明它的工作原理很明显,翻译可以做你想要的,并且警告是误报。

我建议你将其重写为一个表单,使警告消失,并在此过程中提高代码的直观性:

false