[英]Reduce Load time with Entity Framework and Lazy loading
C#WinForms:我在Entity Framework v6.2.0和延遲加載中使用代碼優先方法,問題是將數據加載到網格中需要4到5秒(僅是第一次)。 我想減少此加載時間。 有什么幫助嗎?
public List<ShipmentOrder> GetShipmentOrder()
{
var ObjShipmentOrderResult = context.shipmentOrders.ToList();
List<ShipmentOrderEntity> ObjShipmentOrder = null;
if (ObjShipmentOrderResult != null)
{
ObjShipmentOrder = new List<ShipmentOrderEntity>();
foreach (var item in ObjShipmentOrderResult)
{
context.Entry(item).Reference(e => e.storageGate).Load();
context.Entry(item).Reference(e => e.shippingOrderStatus).Load();
context.Entry(item).Reference(e => e.packingOrder).Load();
ObjShipmentOrder.Add(item);
}
context.Database.Connection.Close();
return AutoMapper.Mapper.Map<List<ShipmentOrder>>ObjShipmentOrder);
}
else
{
return null;
}
}
使用Automapper,您無需擔心延遲加載:
public List<ShipmentOrderViewModel> GetShipmentOrder()
{
var query= context.shipmentOrders.AsQueryable();
return query.ProjectTo<ShipmentOrderViewModel>().ToList();
}
ProjectTo
接受一個IQueryable
(EF查詢通常處理的內容,盡管在這種情況下,因為您使用的是完整的DbSet
,所以我們需要AsQueryable()
)並將投影到該可查詢對象中,以僅加載視圖模型所需的數據。 這將導致對數據庫的優化查詢,以加載填充視圖模型列表所需的所有字段。
原始代碼有一些氣味:
顯然,隨着系統的增長,您需要限制將拉回的記錄數。 隨着記錄數量的增加,僅返回DbSet
所有內容將很快成為一個大問題。
我已經澄清了將返回的對象命名為“視圖模型”,以確保它與Entity類有所區別。 在某些情況下,視圖模型可能會將實體與實體DbContext
,但是在DbContext
范圍之外傳遞實體會出現DbContext
問題,甚至通過選擇一個新的,分離的副本並雙重目的來實體化實體。建議不要將其視為視圖模型。 (實體類應始終被視為實體,如果實體可能是分離的,附加的或不完整的數據表示形式,則會使人迷惑。)
最后,為什么要在上下文中顯式關閉基礎數據庫連接? 上下文的范圍如何? 如果您使用的是IoC容器,例如Autofac,Unity,Ninject等,則應在處理上下文時自動對其進行管理。 前提是上下文范圍是請求的范圍。 如果沒有,上下文在哪里構造? 如果需要關閉連接,則應使用using()塊來限制上下文的范圍,直到您能夠實現IoC容器來管理其生存期。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.