c#在LINQ查询和事务范围中检查空值,表示底层连接打开失败

本文关键字:表示 连接 失败 空值 检查 查询 LINQ 事务 范围 | 更新日期: 2023-09-27 17:50:14

我一直在搞乱2个问题相当长一段时间,我已经尝试了很多事情,但我仍然得到的问题。以下是第一个问题的简化版

我有一个LINQ查询,其中p.p p和XP是双类型?. 当XP的值为"null"时,查询返回错误的结果,即使我在数据库中的p.p p字段为空。

from p in entity.positions
where p.XP == XP
select p;

我也尝试了其他线程在SO上建议的不同事情,如

from p in entity.positions
where Object.Equals(p.XP , XP)
select p;

这给了我下面的异常

无法强制转换类型System。

如何解决这个问题?

问题2: 对于LINQ,我使用TransactionScope来处理事务。当我执行查询时,我得到一个异常

底层连接无法打开。

内部异常是关于DTC的。我在网上读到,我必须在服务器上启用一些服务。但我不想那么做。如何在不启用DTC的情况下使用事务?我的代码是这样的

public void function1()
{
     using(TransactionScope t = new TransactionScope())
     {
         RunSomeSelectQueries();
         RunSomeInsertQueries();
         RunSomeUpdate Queries();
         t.Complete();
     }
}

c#在LINQ查询和事务范围中检查空值,表示底层连接打开失败

这确实是两个问题,应该分为两个问题。

但是我有第一个问题的答案。在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;

在第一个问题中,您需要从比较中单独检查空值,因为空值是单独处理的。

   var foo = (from p in entity.positions
                where (p.XP == null && XP == null)
                  || (p.XP == XP)
              select p);