簡體   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