初始化对象来处理空查询结果

问题描述:

我有一个对象模型是这样的:初始化对象来处理空查询结果

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

你可以做到这一点的方法:

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

为什么不使用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

是您的数据库类型为空的?

如果是这样,你需要在你的类定义:

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

两个地方,你能解决:

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