[英]C# Check null in LINQ query and Transaction Scope giving underlying connection failed to open
很长一段时间我一直在搞乱2个问题而且我已经尝试了很多东西,但我仍然遇到了问题。 以下是第一个问题的简化版本。
我有一个LINQ查询,其中p.XP和XP是double类型? 。 当XP的值为“null”时,即使数据库中的p.XP字段中有空值,查询也会返回错误的结果。
from p in entity.positions
where p.XP == XP
select p;
我也尝试过其他线程建议的不同的东西
from p in entity.positions
where Object.Equals(p.XP , XP)
select p;
这给了我以下例外
无法将System.Nullable类型强制转换为System.Object。
如何解决这个问题?
问题2:对于LINQ,我使用TransactionScope来处理事务。 当我执行查询时,我得到一个例外
底层连接无法打开。
而内在的例外是关于DTC的说法。 我在网上看到,我必须在服务器上启用一些服务。 但我不想这样做。 如何在不启用DTC的情况下使用transcactions。 我的代码是这样的
public void function1()
{
using(TransactionScope t = new TransactionScope())
{
RunSomeSelectQueries();
RunSomeInsertQueries();
RunSomeUpdate Queries();
t.Complete();
}
}
在第一个问题中,您需要与比较分开检查空值,因为空值是分开处理的。
var foo = (from p in entity.positions
where (p.XP == null && XP == null)
|| (p.XP == XP)
select p);
这些实际上是两个问题,应分为两个问题。
但我确实有第一个答案。 在SQL数据库中,NULL不等于NULL。 这是因为NULL意味着表示和未知值,并且不可能声明未知等于另一个未知。
澄清:
“SELECT * FROM sometable where 1 = 1”将返回所有行,因为“1 = 1”为TRUE
“SELECT * FROM sometable where 1 = 0”将不返回任何行,因为“1 = 0”为FALSE
“SELECT * FROM sometable where NULL = NULL”或“SELECT * FROM sometable where 1 = NULL”将不返回任何行,因为“NULL = NULL”或“1 = NULL”等于称为NULL的新“布尔”状态。 如果WHERE子句为TRUE,则查询仅返回一行。
要提取XP为NULL的行,必须将where子句扩展为如下所示:
from p in entity.positions
where p.XP == XP || (p.XP == null && XP == null)
select p;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.