簡體   English   中英

Linq選擇最接近日期的記錄

[英]Linq select records closest to date

如何使用Linq選擇最接近指定日期的記錄? 這是針對具有日期,產品ID,位置ID和余額的交易表。

鑒於這些要求:

  • 如果指定的日期有幾筆交易,請選擇當天的最后一筆交易
  • 如果指定日期沒有最近的交易,請選擇最近的交易
  • 在多個位置(例如倉庫)顯示余額-每個倉庫將有單獨的交易
  • 顯示多種產品的余額-每個產品都有單獨的交易

表格數據:

// code
Id, TransDateTime,    ProductId, WarehouseId, Balance
1,  1-Jan-2011 00:00, 1,         1,           100
2,  1-Jan-2011 00:00, 1,         2,           10
3,  2-Jan-2011 00:00, 1,         1,           150
4,  3-Jan-2011 00:00, 1,         2,           25
5,  3-Jan-2011 00:00, 2,         1,           333
6,  7-Jan-2011 00:00, 1,         1,           149
7,  7-Jan-2011 01:00, 1,         2,           30
8,  7-Jan-2011 02:00, 1,         2,           35

測試日期和輸出

Date: 1-Jan would output:
1,  1-Jan-2011 00:00, 1,         1,           100
2,  1-Jan-2011 00:00, 1,         2,           10

Date: 3-Jan would output:
3,  2-Jan-2011 00:00, 1,         1,           150 
4,  3-Jan-2011 00:00, 1,         2,           25
5,  3-Jan-2011 00:00, 2,         1,           333
// product 1, warehouse 1 wasn't sold on the 3rd
// so the row from 2-Jan is returned

Date: 7-Jan would output:
5,  3-Jan-2011 00:00, 2,         1,           333
6,  7-Jan-2011 00:00, 1,         1,           149
9,  7-Jan-2011 02:00, 1,         2,           35
// product 2, warehouse 1 wasn't sold on the 7th
// so the row from 3-Jan is returned
// product 1, warehouse 2 was sold twice on the 7th
// so the later one is used

我認為這將需要對分組進行分組(產品->倉庫->日期)或類似的分組。 它超出了我的能力!

腳步:
1)過濾掉inputDate之后發生的交易
2)按產品和倉庫將其余交易分組
3)在每個組中找到最近的交易
4)格式化結果對象

簡單實施:

DateTime inputDate = ...;
var result = transactions
          .Where(t => t.TransDateTime.Date <= inputDate.Date)
          .GroupBy(t => new {t.ProductId, t.WarehouseId})
          .Select(x => new {
               x.Key,
               LastTransaction = x.OrderByDescending(t => t.TransDateTime).First(),
          })
          .Select(x => new {
               Id = x.LastTransaction.Id,
               Date = x.LastTransaction.TransDateTime,
               ProductId = x.Key.ProductId,
               WarehouseId = x.Key.WarehouseId,
               Balance = x.LastTransaction.Balance,
          });

如果要進行一些優化,可以考慮為IEnumerable實現MaxBy擴展方法,以替換x.OrderByDescending(t => t.TransDateTime).First() 如果您有很多事務,它將提高性能,因為它是O(n)而不是O(n log n) MaxBy實現可以在這里舉例: C#中的簡單LINQ問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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