我有一个包含许多查找表的数据库表:
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
};
这里更好的方法是什么?
答案 0 :(得分:5)
您本身不需要join
,。您可以使用Navigation Properties
OrderType
和ShippingType
来执行此操作访问它们而无需连接。你会有类似的东西:
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)
观点可能有好处有几个原因:
做任何事情都会导致更易理解的代码。
答案 3 :(得分:0)
使用数据库视图可能会阻碍SQL优化器为您提供最佳执行计划的能力。所以,如果EF生成的查询不是恐怖(使用SQL事件探查器来确保!) 我会去EF。