简单的数学问题与LinQ,简单的连接查询,Nulls等

时间:2009-11-08 05:03:31

标签: linq-to-sql math join null sum

我有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());
}

谢谢!!!

1 个答案:

答案 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 - >量