1. 程式人生 > 其它 >NULL值處理細節

NULL值處理細節

技術標籤:XPO資料庫

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物件。

NullHandling_dbImage

您將獲得一項任務,以檢索不在指定經理的指導下工作的所有員工(包括經理)。假設這位經理是麥克。您可以嘗試使用這樣的條件來解決您的任務。

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。否則,操作員將檢查以確保當前處理的員工不是麥克本人。