使用 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 表达式中。