C# 使用LINQ执行组和连接

C# 使用LINQ执行组和连接,c#,sql,asp.net-mvc,linq,entity-framework,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 =

有没有人对我如何使用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()
    });
}
var statements=db.vwOutstandingStatements.ToList();
var金额=(来自db.VW未结清报表中的s)
按s.Id将s分组为v
选择新的
{
Id=v.键,
金额=总金额(a=>a金额)
}).ToList();
List语句stoprocess=new List();
foreach(以金额表示的风险值金额)
{
var statement=statements.Find(s=>s.Id==amount.Id);
StatementStopProcess.Add(新的vmVendorStatements()
{
Id=statement.Id,
PropertyAddress=statement.PropertyNumber+“”+statement.PropertyStreet+“”+statement.PropertyTown,
StatementDate=语句.StatementDate.ToLongDateString(),
Amount=Amount.Amount.ToString()
});
}
语句通过EF5来自sql视图。我运行LINQ以获得返回视图中按金额之和分组的数据,然后将其合并回来,以显示返回视图中的一些细节以及金额之和。StatementsToView是将数据放入MVC视图的视图模型

我相信这可以用SQL来完成,而且在任何情况下我都可以这样做,但似乎也必须有一个更简洁的解决方案来解决上述问题

谢谢


Jason。

您只需抓取组中的第一个项目,而不是重新查询以查找第一个项目:

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

您只需抓取组中的第一项,而不必重新查询以查找第一项:

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

谢谢你的密码。几乎成功了。我需要在First()上使用FirstOrDefault(),而.ToLongDateString()无法编译,因此我在viewmodel上使用了DataAnnotation,仅显示DateTime属性的日期部分(首先将其转换为DateTime类型),这要感谢代码。几乎成功了。我需要在First()上使用FirstOrDefault(),而.ToLongDateString()无法编译,因此我在viewmodel上使用了DataAnnotation,仅显示DateTime属性的日期部分(首先将其转换为DateTime类型)