繁体   English   中英

C#在LINQ查询和事务范围中检查null,导致底层连接无法打开

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM