3

在我编写的许多应用程序中,我发现自己为 DBML 对象的子类分配了一个默认值。这是我必须这样做的当前方式的示例:

var viewModel = new RandomViewModel
{
    ContactName = (Order.Customer != null ? Order.Customer.ContactName : "Unknown"),
    Date = Order.OrderDate,
    Shipper = (Order.Shipper != null ? Order.Shipper.CompanyName : "Fedex"),
    ShipCity = Order.ShipCity,
    ShipRegion = Order.ShipRegion,
    FirstCategory = (Order.OrderDetails.First().Product.Category != null
        ? Order.OrderDetails.First().Product.Category.CategoryName
        : "DefaultCategory",
    ItemCount = Order.OrderDetails.Count
};

理想情况下,它是最易读的:

var viewModel = new RandomViewModel
{
    ContactName = Order.Customer.ContactName ?? "Unknown",
    Date = Order.OrderDate,
    Shipper = Order.Shipper.CompanyName ?? "Fedex",
    ShipCity = Order.ShipCity,
    ShipRegion = Order.ShipRegion,
    FirstCategory =
        Order.OrderDetails.First().Product.Category.CategoryName
        ?? "DefaultCategory",
    ItemCount = Order.OrderDetails.Count
};

但是对于任何为空的外键对象,都会出现 NullReferenceException。我不认为 null 合并在这里可用,但是有没有其他简洁的方法来完成这个非常频繁的任务?也许带有类/方法扩展,甚至是 VS 宏?

我在这个例子中使用了 Northwind 数据库:

北风数据库

接受任何和所有建议。

4

2 回答 2

1

这是一种可能的方法。声明partial class Order,具有如下属性:

string CustomerNameOrDefault { get { return Customer != null ? Customer.ContactName : "Unknown"; } }

然后你的代码变成:

var viewModel = new RandomViewModel
{
    ContactName = Order.CustomerNameOrDefault,
...
于 2012-07-03T17:40:39.057 回答
0

接受任何和所有建议。

我个人使用AutoMapper在我的域模型和视图模型之间进行映射。您的代码现在可以变成:

RandomViewModel viewModel = Mapper.Map<Order, RandomViewModel>(Order);
于 2012-07-03T17:22:04.143 回答