2010-11-02 47 views
8

我有以下代碼:LinQ中最大日期優化

Decimal initialBalance; 
DateTime dailyDate = ctx.DailyBalances.Max(c => c.DailyDate); 
      if (dailyDate != null) 
       initialBalance = ctx.DailyBalances.Where(c => c.DailyDate == dailyDate).Select(c => c.FinalBalance).FirstOrDefault(); 
      else 
       initialBalance = 0; 

      return initialBalance; 

不過我一直試圖讓的方式來優化它,使一個查詢,而不是一個......任何sugestion?

+1

此代碼沒有任何意義,如下所示:dailyDate永遠不會爲空...(DateTime不能爲空) – 2010-11-02 15:41:36

+0

抱歉您的權利,但我想知道整個問題採取最大值,然後獲取餘額 – Necronet 2010-11-03 05:35:54

回答

14

使用OrderByDescending,採取的第一個記錄:

initialBalance = ctx.DailyBalances 
    .OrderByDescending(c => c.DailyDate) 
    .Select(c => c.FinalBalance) 
    .FirstOrDefault(); 

這種類型的查詢在SQL Server優化,使得它不需要O(N日誌(n))的排序整個表。如果在DailyDate上有一個索引,它將查找索引中的最後一行,如果沒有索引,它將使用運行在線性時間內的優化算法Top N Sort

但是,這個查詢將LINQ to Objects中的O(n log(n))。

+1

很確定你的意思是.OrderByDescending(c => c.DailyDate)。 – 2010-11-02 15:44:32

+0

@Chris Shaffer:是的,謝謝! – 2010-11-02 15:46:14

+0

你真棒。 – starmandeluxe 2017-07-18 05:43:21