使用LINQ执行组和连接

时间:2013-09-23 15:24:37

标签: c# sql asp.net-mvc linq entity-framework

有没有人对如何使用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以按返回视图中的金额总和对数据进行分组,然后将其重新连接以显示返回视图中的一些详细信息以及总和金额。 StatementsToView是我的视图模型,用于将数据导入MVC视图。

我确信它可以在SQL中完成,我可以在任何情况下都这样做,但似乎也必须有一个更简洁的解决方案。

谢谢,

杰森。

1 个答案:

答案 0 :(得分:3)

你可以抓住小组中的第一个项目,而不是仅仅为了找到第一个项目而重新查询:

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();