我不是Linq或Lambda的专家,我真的需要这个查询的帮助。
这就像账户报表,它有借方,贷方和余额。但是我的linq查询错了我在执行此查询时得到了这个结果...
结果: 假设结果是这样的。
这是我的代码:
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任何人都可以帮助我。
答案 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()
,或者不重新使用它而不重置累加器。