gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:29:31 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com