我有2张桌子
1.客户
2.运营
操作可能导致:Credits或Debits(char字段中的'C'或'D')以及date和ammount字段。
我必须使用linQ计算每个客户账户的余额...对于尚未进行操作的客户,结果也应显示余额0
我使用linQ语句有以下函数,但我知道它可以以更好,更快,更短的方式完成,对吧?会是哪个?
public static double getBalance(ref ClasesDeDatosDataContext xDC, string SSN,
int xidClient)
{
var cDebits =
from ops in xDC.Operations
where (ops.idClient == xidClient) && (ops.OperationCode == 'D')
select ops.Ammount;
var cCredits =
from ops in xDC.Operations
where (ops.idClient == xidClient) && (ops.OperationCode == 'C')
select ops.Ammount;
return (double)(cCredits.Sum() - cDebits.Sum());
}
谢谢!!!
答案 0 :(得分:0)
我不知道LINQ-to-SQL引擎是否可以处理表达式,但是这样的事情应该是可能的:
return (
from ops in xDC.Operations
where ops.idClient == xidClient
select ops.operationCode == 'C' ? ops.Amount : -ops.Amount
).Sum(a => a);
或者也许:
return (
from ops in xDC.Operations
where ops.idClient == xidClient
select new { Sign = ops.operationCode == 'C' ? 1.0 : -1.0, Amount = ops.Amount }
).Sum(o => o.Sign * o.Amount);
如果集合为空,则Sum方法返回零,这样就可以处理没有事务的客户端。
编辑:
修正了查询中的拼写:Ampont - >量