实体框架 - Linq to Entities中的数据库视图或连接

时间:2011-02-28 15:10:56

标签: c# entity-framework entity-framework-4

我有一个包含许多查找表的数据库表:

OrderType  
ShippingType  
etc.

我的订单表引用了这些表中的每一个:

Order
  OrderID
  OrderTypeID
  ShippingTypeID

我使用实体框架作为我的数据访问层。我有一个页面需要显示订单的信息。我正在努力找出使用这些实体的最佳/正确方法。

我的页面应该显示如下数据:

订单#1000000
运输类型:UPS
订单类型:在线
等等类型:等等。

最好在数据库中创建一个视图,它带回我需要的数据,然后将其添加到我的实体模型中,并直接使用它,这样我就不必在查询中编写连接了吗?或者像这样创建一个中间类更好:

class OrderView
{
    public int OrderNumber { get; set; }
    public string OrderType { get; set; }
    public string ShippingType { get; set; }
}

var order = from o in db.Orders
            join ot in db.OrderTypes on o.OrderTypeID equals ot.OrderTypeID
            join st in db.ShippingTypes on o.ShippingTypeID equals st.ShippingTypeID
            select new OrderView 
            { 
                OrderNumber = o.OrderNumber, 
                ShippingType = st.Description, 
                OrderType = ot.Description 
            };

这里更好的方法是什么?

4 个答案:

答案 0 :(得分:5)

您本身不需要join您可以使用Navigation Properties OrderTypeShippingType来执行此操作访问它们而无需连接。你会有类似的东西:

var order = from o in db.Orders
            select new OrderView 
            { 
                OrderNumber = o.OrderNumber, 
                ShippingType = o.ShippingType.Description, 
                OrderType = o.OrderType.Description 
            };

我认为在视图中这样做没有任何好处。

答案 1 :(得分:1)

您可以使用Linq-to-entities。当我有一些我无法在L2E中编写的内容(如公用表表达式和层次结构查询)或L2E性能不佳时,我通常会切换到SQL或View。如果您没有这些问题,您应该对L2E感到满意。

顺便说一下。你的查询可以在没有连接的情况下重写 - 该死的@Craig更快。

答案 2 :(得分:0)

观点可能有好处有几个原因:

  1. 他们可以使您与基础表结构中的更改隔离开来
  2. 他们可以抽象出规范化细节(连接)
  3. Yoi可以撤消对表的所有权限,并通过视图提供受限制的访问权限。
  4. 做任何事情都会导致更易理解的代码。

答案 3 :(得分:0)

使用数据库视图可能会阻碍SQL优化器为您提供最佳执行计划的能力。所以,如果EF生成的查询不是恐怖(使用SQL事件探查器来确保!) 我会去EF。