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

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

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

运行时,左连接按预期运行,我得到了 TestTable1 中的所有值,但只有 companyId 匹配的 TestTable2 中有记录。

如果下面的警告是正确的并且表达式始终为假,则字符串“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]

最佳答案

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

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

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

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

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

关于c# - 警告说 Linq-To-Sql 表达式总是错误的,但这是不正确的,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36023539/

相关文章:

asp.net - HttpModule EndRequest 处理程序被调用两次

c# - 如何格式化带前导零且不带分隔符的小数?

mysql - 出现错误 - 每个派生表都必须有自己的别名错误

c# - 扩展和过滤 C# 数组

mysql - 将大型(40 GB).csv 文件上传到 mysql 表的最佳方法是什么

android - SQLITE 批量插入以通过 UPDATE 和 INSERT 增加优化

asp.net - 部署另一个应用程序后无法定位 CodeDom 提供程序

没有列名的javascript序列化

c# - 如何从一个 Visual C# 项目构建两个不同的应用程序?

c# - 获取代表用户权限的列表 - EWS Manage API