使用 Extend / ExtendAs 返回


  在使用 Select 方法返回复杂对象时,你可能会遇到这样的情况,仅仅为了增加一两个属性,而不得不把所有的属性依次打出来,这是相当费劲的。如下面的代码所示,仅仅为了增加 ProductName 属性。

public class OrderDetailsDto : OrderDetails
{
    public string ProductName { get; set; }
}

[TestMethod]
public void TestSelectAll()
{
    using (var db = new DbContext())
    {
        var list = db.OrderDetails.Select(s => new OrderDetailsDto
            {
                OrderID = s.OrderID,
                ProductID = s.ProductID,
                Quantity = s.Quantity,
                UnitPrice = s.UnitPrice,
                Discount = s.Discount,
                ProductName = s.Products.ProductName
            })
            .ToList();

        Assert.AreEqual("Queso Cabrales", list[0].ProductName);
    }
}

  Extend 和 ExtendAs 可以很好地解决这样的问题。

  使用 ExtendAs,可以将实体进行扩展另一个扩展对象,只需要在 ExtendAs 后面使用需要扩展的属性初始化表达式就可以了。

[TestMethod]
public void TestExtendAs()
{
    using (var db = new DbContext())
    {
        var list = db.OrderDetails.Select(s => 
            s.ExtendAs<OrderDetailsDto>(() => new OrderDetailsDto
                {
                    ProductName = s.Products.ProductName
                }))
            .ToList();

        Assert.AreEqual("Queso Cabrales", list[0].ProductName);
    }
}

  当然,new 表达式也可以使用匿名类型,不一定必须使用欲扩展的类型,实现的效果是一样的。

[TestMethod]
public void TestExtendAs()
{
    using (var db = new DbContext())
    {
        var list = db.OrderDetails.Select(s => 
            s.ExtendAs<OrderDetailsDto>(() => new 
                {
                    ProductName = s.Products.ProductName
                }))
            .ToList();

        Assert.AreEqual("Queso Cabrales", list[0].ProductName);
    }
}

  Extend 与 ExtendAs 不同之处仅仅在于,Extend 将对象扩展为 dynamic 类型。这样的好处在于不用定义扩展类型,但要注意的是 dynamic 类型的动态绑定特性。

[TestMethod]
public void TestExtend()
{
    using (var db = new DbContext())
    {
        var list = db.OrderDetails.Select(s =>
            s.Extend(() => new
                {
                    ProductName = s.Products.ProductName
                }))
            .ToList();

        Assert.AreEqual("Queso Cabrales", list[0].ProductName);
    }
}

  Extend 和 ExtendAs不能单独使用,必须使用在 Select 表达式中。