NULL值處理細節
阿新 • • 發佈:2021-02-16
NULL值處理細節
- 2020年8月24日
- 4分鐘閱讀
本主題描述使用’null’值的細節,以及在編寫條件時應如何對待它們。
考慮以下示例。該員工持久化類暴露了兩個屬性-名字和經理。名稱是指定員工姓名的字串屬性。如果當前物件不代表經理,則經理是引用Employee物件的引用屬性。如果當前僱員是經理,則該屬性包含空引用。
public class Employee : XPObject {
public string Name {
get { return fName; }
set { SetPropertyValue (nameof(Name), ref fName, value); }
}
string fName;
public Employee Manager {
get { return fManager; }
set { SetPropertyValue(nameof(Manager), ref fManager, value); }
}
Employee fManager;
}
假設一個數據庫包含六個Employee物件。
您將獲得一項任務,以檢索不在指定經理的指導下工作的所有員工(包括經理)。假設這位經理是麥克。您可以嘗試使用這樣的條件來解決您的任務。
XPCollection<Employee> team = new XPCollection<Employee>();
Employee manager =
Session.DefaultSession.FindObject<Employee>(CriteriaOperator.Parse("[Name] = 'Mike'"));
team.Criteria = CriteriaOperator.Parse("Manager.Oid <> ? And Oid <> ?" , manager.Oid, manager.Oid);
int count = team.Count; // Returns 2 (Nathan and Bob)
該程式碼應返回所有不在Mike監督下工作的員工,Mike本人除外。在我們的示例中,應為John,Nathan和Bob。但是,您看到的結果集合僅包含Nathan和Bob。這是因為約翰沒有分配經理。在SQL中,您無法將值與“ null”進行比較。這樣的比較不會產生布爾值,而是會產生“未知”值,從而導致結果集為空。由於John沒有管理員,因此相應的資料庫列為’null’。上面演示的標準試圖將“ null”與Mike的識別符號進行比較。這樣的比較無法正確評估,因此,John從結果集合中省略了。
在編寫這樣的條件時,您需要顯式檢查引用屬性值是否不是’null’。此外,您不能通過編寫“ Manager == NULL”來執行此操作,因為這也將與無法正確評估的“ null”進行比較。要檢查值是否為“ null”,必須使用SQL“ is null”謂詞。在XPO上下文中,這轉換為使用IsNull函式運算子。下面的程式碼片段演示了可以按預期執行的重寫條件。
XPCollection<Employee> team = new XPCollection<Employee>();
Employee manager =
Session.DefaultSession.FindObject<Employee>(CriteriaOperator.Parse("[Name] = 'Mike'"));
team.Criteria = CriteriaOperator.Parse("Iif(IsNull(Manager), Oid, Manager.Oid) <> ?", manager.Oid);
int count = team.Count; // Returns 3 (John, Nathan and Bob)
unt = team.Count; // Returns 3 (John, Nathan and Bob)
演示的條件操作員檢查是否設定了Manager屬性值,這表示當前處理的員工引用了經理。如果是,則操作員確保所引用的管理員不是Mike。否則,操作員將檢查以確保當前處理的員工不是麥克本人。