如何使用Lambda或Linq中的最后一列值增加列

时间:2014-12-10 21:51:33

标签: c# linq lambda

我不是Linq或Lambda的专家,我真的需要这个查询的帮助。

这就像账户报表,它有借方,贷方和余额。但是我的linq查询错了我在执行此查询时得到了这个结果...

结果: enter image description here 假设结果是这样的。 enter image description here

这是我的代码:

 decimal Balance = 0;
 var result = from a in entities.Payments
              where a.StudentID == ParamStudentID
              select new
              {
                 Date = a.DateAdded,
                 Code = entities.Particulars.Where(p => p.Name == a.PaymentDes).Select(sp => sp.Code).FirstOrDefault(),
                 Particulars = a.PaymentDes,
                 Debit = 0,
                 Credit = a.Amount,
                 Balance = Balance + a.Amount,
                 SyTerm = a.SchoolYear + "-" + a.Term.Trim().Substring(0, 5)
              };

我知道这是一个简单的问题,但我不知道如何解决。 :D任何人都可以帮助我。

3 个答案:

答案 0 :(得分:1)

希望有所帮助:

 var result = from a in entities.Payments
          where a.StudentID == ParamStudentID
          select new
          {
             Date = a.DateAdded,
             Code = entities.Particulars.Where(p => p.Name == a.PaymentDes).Select(sp => sp.Code).FirstOrDefault(),
             Particulars = a.PaymentDes,
             Debit = 0,
             Credit = a.Amount,
             Balance = entities.Payments.Where(x => x.StudentID == ParamStudentID).TakeWhile(x => x != a).Sum(x => x.Amount) + a.Amount,
             SyTerm = a.SchoolYear + "-" + a.Term.Trim().Substring(0, 5)
          };

我道歉,如果我有任何语法错误,但我在记事本中写了它,但你可以得到这个想法:)。

答案 1 :(得分:0)

当您使用Entity Framework时,您正在处理更严格的LINQ版本。 LINQ是围绕不可变变量设计的。您可以通过在查询之外使用可变变量来绕过它,但是使用LINQ to Entities这个选项就会消失。

处理它的一种方法是执行相同的查询,然后遍历它并设置余额。

var result = (from a in entities.Payments
             where a.StudentID == ParamStudentID
             orderby a.DateAdded ascending
             select new
             {
                 Date = a.DateAdded,
                 Code = entities.Particulars.Where(p => p.Name == a.PaymentDes).Select(sp => sp.Code).FirstOrDefault(),
                 Particulars = a.PaymentDes,
                 Debit = 0,
                 Credit = a.Amount,
                 Balance = 0,
                 SyTerm = a.SchoolYear + "-" + a.Term.Trim().Substring(0, 5)
              }).ToList();

double balance = 0;

foreach(var item in result)
{
    balance += item.Credit;
    item.Balance = balance;
}

在LINQ查询中可能有其他方法可以做到这一切,但我认为它们可能会相对复杂或者使SQL非常奇怪。

答案 2 :(得分:0)

 decimal balance = 0;  //Change for clarity
 var result = (from a in entities.Payments
              where a.StudentID == ParamStudentID
              select new
              {
                 Date = a.DateAdded,
                 Code = entities.Particulars.Where(p => p.Name == a.PaymentDes).Select(sp => sp.Code).FirstOrDefault(),
                 Particulars = a.PaymentDes,
                 Debit = 0,
                 Credit = a.Amount,
                 SyTerm = a.SchoolYear + "-" + a.Term.Trim().Substring(0, 5)
              }).ToList()
                .Select(r=>new 
                   {
                       Rec = r, 
                       Balance = balance += r.Credit
                   });

注意: 这仅在首次使用查询时有效。您应该在查询结尾处抛出.ToList(),或者不重新使用它而不重置累加器。