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