2012-10-28 46 views
0

有誰知道使用實體框架爲下面描述的問題使用實體框架的好方法嗎?使用實體框架立即加載多個父記錄的最後一條相關記錄

我正在嘗試爲我們的下一個版本提供一種高性能的方式來顯示登錄客戶的下單。 當然,當大量數據可用時,分頁總是一種很好的技術我希望看到沒有任何分頁技術的答案。

下面是故事:一位客戶下訂單,獲得orderstatus = PENDING。根據某種策略,我們將該訂單移至連鎖店以獲得批准。 每一次狀態變化都會被記錄下來,所以我們可以看到狀態的蹤跡,甚至可以爲每個狀態添加一行額外的註釋,這可以爲在界面中看到這個命令的任何人提供一些額外的有價值的信息。

因此,訂單鏈接到客戶。一個訂單可以在OrderStatusHistory中存儲多個orderstatusses。

在我的測試情景中,我使用的客戶有100多個訂單,每個訂單在OrderStatusHistory表中有大約5條記錄。 我現在想要看到一個頁面中的所有訂單不使用分頁,其中對於每個訂單,我顯示最後一個相關的狀態和額外的評論(如果有最後一個狀態;這兩個字段來自OrderStatusHistory;帶有給定OrderId的最高ID)。

我嘗試了多種場景,但我希望看到任何其他解決方案或對已嘗試過的東西的評論。

  • 試圖獲得訂單,但是這仍然導致數據庫上推出多個查詢時也包括()。每個訂單觸發對數據庫的額外查詢以獲取歷史記錄表中的所有orderstatus。因此,在這裏查詢所有狀態,而不是僅返回最後一個相關狀態,另外爲100個訂單啓動100個額外查詢。當數據庫中有100000多個訂單時,您可以想象這個問題。
  • 在數據庫上有2個計算列:LastStatus,LastStatusInformation和一個常規的L​​inq-Query,它們可以通過實體模型獲得那些列。 這種方法的問題是,這些計算列使用的是標量函數不能在不脫離計算列除去式被改變,等等確定的事實...

在端我很熟悉使用SQL和存儲過程,但由於數據層的其餘部分使用Entity Framework,我希望儘可能長時間地使用它,即使我對性能有懷疑。使用SQL方法 我會寫這樣的事:

WITH cte (RN, OrderId, [Status], Information) 
AS 
(
SELECT ROW_NUMBER() OVER (PARTITION BY OrderId ORDER BY Id DESC), OrderId, [Status], Information 
FROM OrderStatus 
) 
SELECT o.Id, cte.[Status], cte.Information AS StatusInformation, o.* FROM [Order] o 
INNER JOIN cte ON o.Id = cte.OrderId AND cte.RN = 1 
WHERE CustomerId = @CustomerId 
ORDER BY 1 DESC; 

返回所有訂單由公用表表達式提供的statusinformation客戶。

有誰知道使用Entity Framework的好方法嗎?

回答

3

像這樣的東西應該工作,只要你想(做只有1 DB調用),但我沒有測試:

var result = from order in context.Orders 
      where order.CustomerId == customerId 
      let lastStatus = order.OrderStatusHistory.OrderBy(x => x.Id).Last() 
      select new 
      { 
       //you can return the whole order if you need 
       //Order = order, 
       //or only the information you actually need to display 
       Number = order.Number, 
       Status = lastStatus.Status, 
       ExtraComment = lastStatus.ExtraComment, 
      }; 

這裏假設你的Order類看起來是這樣的:

public class Order 
{ 
    public int Id { get; set; } 
    public int CustomerId { get; set; } 
    public string Number { get; set; } 
    ... 
    public ICollection<OrderStatusHistory> OrderStatusHistory { get; set; } 
} 

如果你的Order類沒有類似ICollection<OrderStatusHistory> OrderStatusHistory屬性的東西,那麼你需要先做一個連接。讓我知道如果是這樣的話,我會編輯我的答案,包括join

+0

聽起來很不錯。我明天將在工作中測試這個。當我分析這個查詢時,好奇什麼是性能和輸出。 –

相關問題