我在下面代码中的评论中注明的行上收到警告。我正在使用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]
答案 0 :(得分:3)
警告是因为将2 K
7 T
表达式与int
进行比较始终为null
。
这在查询表达式中可能有所不同。提供商可以转换为任何喜欢的内容。显然,C#编译器选择仍然警告你,尽管这是一个查询。
我不知道L2S将其转化为什么。你声明它的工作原理很明显,翻译可以做你想要的,并且警告是误报。
我建议你将其重写为一个表单,使警告消失,并在此过程中提高代码的直观性:
false