将实体投影到匿名对象,而其某些导航属性可能为 null



我希望这个问题不会令人困惑,我想做的是将匿名对象列表绑定到网格,我有一个class Client,我正在将客户端投影到匿名对象列表中,以便我可以在网格中显示其详细信息,如下所示:

this.gridControl1.DataSource = _clients.Select(c => new
{
    c.ClientId,
    c.FirstName,
    c.LastName,
    c.Details.Country, //throws NullReferenceException since I added a 
                       //client with no details.
    c.Details.City,
    c.Details.Adress,
    c.Details.Email
}).OrderByDescending(c => c.ClientId);

问题是某些客户端可能尚未添加详细信息。当试图绑定时,我显然得到了一个NullReferenceException..我进行投影的原因是为了避免网格中Details列,这是无用的。

那么,有什么解决方案吗?或者遇到这个问题的不同方法?谢谢

假设字段是字符串,请尝试

country = c.Details != null ? c.Details.Country : "", // or null or another
                                                      // appropriate default value

等,而不是

c.Details.Country

您可以使用三元运算符执行此操作:

c.Details == null ? null : c.Details.Country

如果不看到客户端是如何创建的,我不确定什么对你有用。 以下是一些建议:

  1. 使用具有字符串的"空白"详细信息对象实例化客户端。在所有属性中为空。

  2. 使 Client.Details 成为私有属性,然后公开公共属性(国家/地区、城市等),这些属性只有 getter,当私有 Details 对象为 null 时返回空字符串。 如果需要在外部访问 Details 对象,请使用方法而不是属性:

    class Details
    {
        public string Country { get; set; }
    }
    class Client
    {
        private Details _details;
        public string Country
        {
            get
            {
                return _details == null ? string.Empty : _details.Country;
            }
        }
        public Details GetDetails()
        {
            return _details;
        }
    }
    

这将具有允许您消除匿名选择的额外好处,因为 Details 对象将不再是属性,因此被绑定过程忽略。 可以将客户端集合直接绑定到网格。

最新更新