【问题标题】:Anonymous array accepting null values for int匿名数组接受 int 的空值
【发布时间】:2016-01-18 04:11:41
【问题描述】:

查询订单模型

public class InquiryOrder
{
    [Key]
    public int InquiryOrderId { get; set; }

    public string InquiryOrderName { get; set; }

    [ForeignKey("ProductType")]
    public int? ProductTypeId { get; set; }
    public virtual ProductType ProductType { get; set; }
}

查询订单控制器

var displayedInquiryOrders = filteredInquiryOrders.Skip(iDisplayStart).Take(iDisplayLength);
    var result = from c in displayedInquiryOrders .AsEnumerable()
                  select new[] { 
                            Convert.ToString(c.InquiryOrderId),
                            c.InquiryOrderName,
                            c.ProductType.ProductTypeName,
                        };

如果ProductTypeIdInquiryOrder 表中有空值,我从数组中的c.ProductType.ProductTypeName 收到此错误Object reference not set to an instance of an object。如何调整此数组以使其接受 int 的空值。谢谢!

【问题讨论】:

    标签: c# linq anonymous-arrays


    【解决方案1】:

    如果ProductTypeId 为空,这意味着实体框架不能延迟加载实体的产品类型,因为它不存在。

    这意味着当您调用 c.ProductType.ProductTypeName 时,c.ProductType 为 null,而您在尝试获取 ProductTypeName 值时得到 NullReferenceException

    您可以通过多种方式解决此问题。如果您使用的是最新版本的 C#,则可以使用 Null 条件运算符 (?.) https://msdn.microsoft.com/en-us/library/dn986595.aspx

    select new[] { 
        Convert.ToString(c.InquiryOrderId),
        c.InquiryOrderName,
        c.ProductType?.ProductTypeName,
    };
    

    如果没有,您可以使用三元运算符来执行相同的功能:

    select new[] { 
        Convert.ToString(c.InquiryOrderId),
        c.InquiryOrderName,
        c.ProductType != null ? c.ProductTypeProductTypeName : string.Empty,
    };
    

    【讨论】:

    • 是的,这行得通。感谢您提供宝贵的信息!
    【解决方案2】:

    你可能想使用三元运算符

    var displayedInquiryOrders = filteredInquiryOrders.Skip(iDisplayStart).Take(iDisplayLength);
    var result = from c in displayedInquiryOrders .AsEnumerable()
                  select new[] { 
                            Convert.ToString(c.InquiryOrderId),
                            c.InquiryOrderName,
                            c.ProductType != null ? c.ProductType.ProductTypeName : null, //if not null, then add the product type, otherwise add null
                        };
    

    在 C#6.0 中,我认为您可以通过 ?. 来实现

    var displayedInquiryOrders = filteredInquiryOrders.Skip(iDisplayStart).Take(iDisplayLength);
    var result = from c in displayedInquiryOrders .AsEnumerable()
                  select new[] { 
                            Convert.ToString(c.InquiryOrderId),
                            c.InquiryOrderName,
                            c.ProductType?.ProductTypeName
                        };
    

    【讨论】:

    • 是的,这行得通。由于Steve 把答案放在第一位,我标记了它。但是非常感谢你帮助我..
    猜你喜欢
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多