我有一張像這樣的桌子
| 用戶身份 | 產品名稱 | 交易標識 | 日期 |
|---|---|---|---|
| 6556656 | 蘋果 | 3534534 | 25.10 |
| 6556656 | 蘋果 | T423423 | 23.10 |
| 6556656 | 橙 | 7687898 | 22.10 |
| 6556656 | 橙 | 5675665 | 27.10 |
| 6556656 | 橙 | 1231312 | 25.09 |
| 6556656 | 香蕉 | 4564545 | 14.09 |
| 6556656 | 香蕉 | 7898878 | 30.09 |
如您所見,我有 7 行,其中有 3 種產品。我不需要全部 7 行。我只需要得到一個。結果我只需要 3 行,其中只有一個按日期排序的蘋果、橙子和香蕉(每組中最晚的)
需要撰寫類似這樣的查詢
var result = _db.Fruits.GroupBy(o => o.ProductName).Select(g => g.OrderByDescending(o => o.Date).FirstOrDefault()我嘗試任何情況但沒有結果。
uj5u.com熱心網友回復:
快速回答
您想獲取每個組的第一次出現。
您可以在 a上使用OrderBy :FirstGroupBy
var top =
db
.Transactions
.GroupBy(
t=> t.Product
)
.Select(t=>new {
t.Key,
date=t.OrderBy(x => x.Date).Select(x=>x.Date).First() // <- Magic is Here!
})
.ToList();
這會產生:
SELECT t.Product AS Key, (
SELECT t0.Date
FROM Transactions AS t0
WHERE t.Product = t0.Product
ORDER BY t0.Date
LIMIT 1) AS date
FROM Transactions AS t
GROUP BY t.Product
注意,用于OrderByDescending獲取最后一個Date(而不是第一個)
更詳細
Transaction如果您想要每個組的整個模型:
var top =
db
.Transactions
.GroupBy(
t=> t.Product
)
.Select(t=>new {
productname = t.Key,
lasttransaction= t.OrderByDescending(x => x.Date).First()} )
.AsEnumerable() // <-- at this point you should to move sql to client
.Select(t => new {t.productname, t.lasttransaction.Date} )
.ToList();
即翻譯為:
SELECT t0.Product, t1.TransactionId, t1.Date, t1.Product
FROM (
SELECT t.Product
FROM Transactions AS t
GROUP BY t.Product
) AS t0
LEFT JOIN (
SELECT t2.TransactionId, t2.Date, t2.Product
FROM (
SELECT t3.TransactionId, t3.Date, t3.Product, ROW_NUMBER() OVER(PARTITION BY t3.Product ORDER BY t3.Date DESC) AS row
FROM Transactions AS t3
) AS t2
WHERE t2.row <= 1
) AS t1 ON t0.Product = t1.Product
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/526049.html
標籤:C#实体框架窗函数
上一篇:Ef包括未更新的鏈接表
