2011-05-28 60 views
2

我有一個對象模型是這樣的:初始化對象來處理空查詢結果

public class MyObject{ 
    public int Prop1{get;set;} 
    public int Prop2{get;set;} 
} 

我使用這個對象的LINQ to SQL的查詢是這樣的:

var MyQuery = from.... 
       where.... 
       select new MyObject() 
       { 
        Prop1 = ... 
        Prop2 = ... 
       }; 

的問題是,有時Prop1在查詢中變爲空,並且由於Prop1爲空,我得到一個錯誤。

我加入這類:

public class MyObject{ 
... 
public void Init() 
{ 
    this.Prop1 = 0; 
    this.Prop2 = 0; 
} 

如何鏈接初始化到事件「對象剛剛創建的」?

而且,通過將對象初始化爲0來解決null的問題是最好的方法嗎?

感謝您的建議。

編輯:我在UI使用PROP1,我不能顯示爲空,必須爲0。

+1

'Prop1 = ... ?? 0'看起來更容易... – forsvarir 2011-05-28 23:07:32

+0

不知道MyObject做什麼的細節,以及每個屬性的意圖是什麼,所以不可能有真正的答案。 – Ocelot20 2011-05-28 23:07:35

回答

4

你可以做到這一點的方法:

select new MyObject() 
      { 
       Prop1 = prop1 ?? 0; 
       Prop2 = prop2 ?? 0; 
      }; 

但它是更好地使用nullables。

+0

'更好'取決於後續處理,如果後續處理將以與處理0相同的方式處理空值,則可能會立即轉換,而不是具有潛在許多未來空值檢查。正如@Ocelot20在上面的評論中所說的,它很大程度上取決於'MyObject'的功能以及它的使用方式。 – forsvarir 2011-05-28 23:17:45

+0

@forsvarir當然,這取決於隨後如何使用它。我只是從美學角度思考 - LINQ查詢必須儘可能清晰。 – Centro 2011-05-28 23:25:24

+0

如何將對象初始化爲0而不是在查詢級別進行初始化?什麼事件處理程序? – frenchie 2011-05-29 00:03:23

2

爲什麼不使用Nullable<int>呢?

public class MyObject{ 
    public int? Prop1{get;set;} 
    public int? Prop2{get;set;} 
} 

int?Nullable<int>的簡寫。這意味着,現在的Prop1Prop2都可以是null

或者,如果你想零,而不是零,那麼這樣做的LINQ:

select new MyObject() { Prop1 = p1 ?? 0, Prop2 = p2 ?? 0 } 
+0

好的,但如何創建一個事件處理程序,自動將值設置爲0? Prop1在UI中使用,我不能顯示null。 – frenchie 2011-05-29 00:01:42

+0

@frenshie:查看修改。順便說一句,你在WPF/Silverlight應用程序中顯示它,然後即使使用'Nullable'也可以工作。所有你需要寫一個轉換器,你也可以在其他情況下使用。 – Nawaz 2011-05-29 00:11:12

2

是您的數據庫類型爲空的?

如果是這樣,你需要在你的類定義:

public int? Prop1 { get; set; } 

或者你的施法使用Convert.ToInt32(databseField)數據庫類型轉換爲int

+0

我在用戶界面中使用Prop1,我無法顯示null;必須初始化。你對事件處理程序有什麼看法? – frenchie 2011-05-29 00:04:35

+0

在這種情況下,使用「Prop1 = DatabaseField.Getvalueordefault()」或「Prop1 =(DatabaseField ??」「」)「 – Oliver 2011-05-29 00:10:36

+0

不,我使用MyObject來填充linq查詢,我想保持查詢相關的代碼單獨從類定義。 – frenchie 2011-05-29 00:12:53

2

兩個地方,你能解決:

public int? Prop1{get;set;} 

select new MyObject() 
      { 
       Prop1 = // check for null here and put default value. 
+0

我在用戶界面中使用Prop1,我無法顯示null;必須初始化。你對事件處理程序有什麼看法? – frenchie 2011-05-29 00:04:19

+0

是的,你可以檢查事件處理程序或使用第二個選項。 – Hogan 2011-05-29 02:25:42