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

时间:2015-05-01 19:24:28

标签: c# linq entity-framework binding

我希望这个问题不会令人困惑,我想要做的是将匿名对象列表绑定到网格,我有一个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无效。

那么,任何解决方案?或者遇到这种不同的方法?感谢

3 个答案:

答案 0 :(得分:1)

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

c.Details.Country

等。而不是

datetime.date(df.a_date.year, df.a_date.month, df.a_date.day)

答案 1 :(得分:1)

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

hexdump(pkt)

答案 2 :(得分:1)

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

  1. 使用"空白"实例化客户端详细信息对象在所有属性中都包含string.Empty。

  2. Make Client.Details一个私有属性,然后公开只有getter的公共属性(Country,City等),当私有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;
        }
    }
    
  3. 这将带来额外的好处,允许您消除匿名选择,因为Details对象不再是Property,因此被绑定进程忽略。您可以将客户端集合直接绑定到网格。