我在下面代码的注释中指出的行收到警告。我正在使用 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/