我正在尝试使用WebGrid HtmlHelper来显示来自少数实体的数据。 WebGrid的源代码由linq查询准备:var query = db.Orders.Include(o => o.OrderStatus)
。
我能够显示来自两个实体的聚合数据,并且工作正常。
但是在另一种情况下,当我尝试做同样的事情但是使用另一组数据时,我遇到了无法解决的问题。
我的控制器查询:
var query = db.SerNum.Include(o => o.Orders).Include(o => o.Item)
我的浏览网页:
@grid.GetHtml(columns: grid.Columns(
grid.Column("Item.Name", "Item Name"),
grid.Column("Price", "Price"),
grid.Column("Order.shpOrderID", "Order ID"),
grid.Column("SellDate", "Date")
))
当我调试我的项目时,我收到错误。
无法显示WebGrid - Item.Name和Order.shpOrderID不存在
这是因为并非所有SerNum
在Order和Item表中都有一个链接记录。有人可以建议我如何解决这个问题吗?
答案 0 :(得分:1)
我建议使用DTO,这是一种未被跟踪且与EF无关的POCO。此DTO对象将匹配您的网格所需的数据,并将调用类似ProductGridView
的内容。这将使您的查询更有效率,您在LINQ中使用的每个.Include()
选择该表中的每一列数据。这是一个简单的例子,请记住,我不知道你的实体的属性是什么样的:
puclic class ProductGridView {
public string ItemName {get; set;}
public double Price {get; set;}
public int OrderId {get; set;}
public DateTime SellDate {get; set;}
}
您现在可以更改链接查询:
var results = db.SerNum.Include(o => o.Orders).Include(o => o.Item)
.Select(x => new ProductGridView{
ItemName = x.Item.Name,
...Rest Of Mapping...
}).ToList();
您现在可以将这些结果返回到您的网格,它应该可以正常工作并且效率更高。
以下是有关DTO的更多信息:http://rlacovara.blogspot.com/2009/03/what-is-difference-between-dto-and-poco.html