代码之家  ›  专栏  ›  技术社区  ›  Enrique

带有LINQ、简单联接查询、空值等的简单数学问题

  •  0
  • Enrique  · 技术社区  · 15 年前

    我有2张桌子。
    1.顾客
    2。操作

    操作可能导致:贷项或借记项(char字段中为“c”或“d”),以及日期和金额字段。

    我必须使用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 回复  |  直到 15 年前
        1
  •  0
  •   Guffa    15 年前

    我不知道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->amount