如何构建正确的linq到实体查询以从多个实体获取数据(左外连接模拟)

时间:2012-02-03 15:43:48

标签: asp.net-mvc-3 entity-framework

我正在尝试使用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表中都有一个链接记录。有人可以建议我如何解决这个问题吗?

1 个答案:

答案 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