Mat*_*lin 5 c# sql linq asp.net linq-to-sql
我在以下代码的注释中指出的行上收到警告。我正在使用Visual Studio2015。数据库中有2个表,并使用Linq-2-Sql查询它们。Linq代码在companyID的两个表之间执行左连接。
运行时,左联接将按预期运行,并且我获得了TestTable1中的所有值,但仅获得了CompanyIds匹配的TestTable2中的记录。
如果以下警告是正确的并且表达式始终为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>");
}
Run Code Online (Sandbox Code Playgroud)
这是警告
CS0472 The result of the expression is always 'false' since a value of type 'int' is never equal to 'null' of type 'int?'
Run Code Online (Sandbox Code Playgroud)
下面是生成的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]
Run Code Online (Sandbox Code Playgroud)
警告是因为将任何int表达式与nullis进行比较false。
这在查询表达式中可能有所不同。提供者可以将其翻译成任何它喜欢的内容。显然,尽管这是一个查询,C# 编译器仍然选择向您发出警告。
我不知道 L2S 将其翻译成什么。你说它有效,所以显然翻译达到了你想要的效果,并且警告是误报。
我建议您将其重写为一种形式,使警告消失并在此过程中增加代码直观性:
value1 = t2 == null ? "NULL" : "INT"
Run Code Online (Sandbox Code Playgroud)