簡體   English   中英

通過實體框架和延遲加載減少加載時間

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM