我在資料庫中有一個名為 Balance 的表和一個日期串列,如下所示:
List<string> allDates = { "2021-01-02", "2021-01-03", "2021-01-04" }
余額表:
Id, Amount, BalanceDate
1, 233, "2021-01-02"
2, 442, "2021-01-03
我需要獲取余額表中缺失日期的金額為 0 的記錄。例如:
233, "2021-01-02"
442, "2021-01-03"
0, "2021-01-04"
我嘗試了以下方法:
balnces.GroupJoin(allDates,
balance => balance.Date,
d => d,
(balance, d) => balance);
但是記錄還是一樣的(只有余額表中的那些)
uj5u.com熱心網友回復:
給定資料庫中的資料結構:
private class balance
{
public int id { get; set; }
public double amount { get; set; }
public string date { get; set; }
}
您可以根據需要獲取資料(這只是一個模型)
List<string> allDates = new List<string> { "2021-01-02", "2021-01-03", "2021-01-04" };
List<balance> balances = new List<balance>();
balances.Add(new balance { id = 1, amount = 233 , date = "2021-01-02" });
balances.Add(new balance { id = 2, amount = 442, date = "2021-01-03" });
你可以通過這種方式得到你想要的結果:
List<balance> result = allDates.Select(d=>
new balance {
amount =
balances.Any(s=> s.date == d)?
balances.FirstOrDefault(s => s.date == d).amount:0,
date = d
}).ToList();
如果您的默認值包含 0 而不是 null,則可以跳過 .Any 檢查
uj5u.com熱心網友回復:
假設
余額查詢已物化,資料已從資料庫回傳。
解決方案 1:使用 .DefaultIfEmpty()
using System.Linq;
var result = (from a in allDates
join b in balances on a equals b.Date.ToString("yyyy-MM-dd") into ab
from b in ab.DefaultIfEmpty()
select new { Date = a, Amount = b != null ? b.Amount : 0 }
).ToList();
解決方案 1 的示例程式
解決方案 2:使用 .ToLookup()
var lookup = balances.ToLookup(x => x.Date.ToString("yyyy-MM-dd"));
var result = (from a in allDates
select new
{
Date = a,
Amount = lookup[a] != null && lookup[a].Count() > 0 ? lookup[a].First().Amount : 0
}
).ToList();
解決方案 2 的示例程式
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411177.html
標籤:
