使用 LINQ 执行组和联接
本文关键字:LINQ 执行 使用 | 更新日期: 2023-09-27 18:32:38
有人对如何使用 LINQ 执行此操作有任何建议吗?
var statements = db.vwOutstandingStatements.ToList();
var amounts = (from s in db.vwOutstandingStatements
group s by s.Id into v
select new
{
Id = v.Key,
amount = v.Sum(a => a.Amount)
}).ToList();
List<vmVendorStatements> statementsToProcess = new List<vmVendorStatements>();
foreach (var amount in amounts)
{
var statement = statements.Find(s => s.Id == amount.Id);
statementsToProcess.Add(new vmVendorStatements()
{
Id = statement.Id,
PropertyAddress = statement.PropertyNumber + " " + statement.PropertyStreet + " " + statement.PropertyTown,
StatementDate = statement.StatementDate.ToLongDateString(),
Amount = amount.amount.ToString()
});
}
语句是通过 EF5 从 SQL 视图获取的。我运行 LINQ 来获取按返回视图中金额总和分组的数据,然后将其联接回以显示返回视图中的一些详细信息以及总金额。StatementToView 是我的视图模型,用于将数据放入 MVC 视图中。
我相信它可以在SQL中完成,无论如何我都可以这样做,但似乎也必须有一个更简洁的解决方案。
谢谢
杰森。
您可以只获取组中的第一项,而不是重新查询只是为了找到第一项:
var statementsToProcess =
(from s in db.vwOutstandingStatements
group s by s.Id into v
let first = v.First()
select new vmVendorStatements()
{
Id = v.Key,
amount = v.Sum(a => a.Amount),
PropertyAddress = first.PropertyNumber + " " + first.PropertyStreet + " " + first.PropertyTown,
StatementDate = first.StatementDate.ToLongDateString(),
}).ToList();