Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用两个不同的where子句两次简化列的LINQ和_C#_Linq - Fatal编程技术网

C# 用两个不同的where子句两次简化列的LINQ和

C# 用两个不同的where子句两次简化列的LINQ和,c#,linq,C#,Linq,我有下面的代码片段,它需要两次往返到DB,因为where子句是不同的 public string OutStanding(string PC) { var d = _context.MyTable.Where(w => w.debit == PC).Sum(s => s.amount); var c = _context.MyTable.Where(w => w.credit == PC).Sum(s => s.amount); return (d

我有下面的代码片段,它需要两次往返到DB,因为where子句是不同的

public string OutStanding(string PC)
{
    var d = _context.MyTable.Where(w => w.debit == PC).Sum(s => s.amount);
    var c = _context.MyTable.Where(w => w.credit == PC).Sum(s => s.amount);
    return (d - c).ToString();
}

可以简化为一次往返DB吗?

是的,您可以简化为一次往返DB,类似于

public string OutStanding(string PC)
{
    var rawData = _context.MyTable.Where(w => w.debit == PC || w.credit == PC).ToList();
                                                          //^^ using OR operator 
    var d = rawData.Where(w => w.debit == PC).Sum(s => s.amount);
    var c = rawData.Where(w => w.credit== PC).Sum(s => s.amount);
    return (d - c).ToString();
}

是的,你可以把它简化为一次到DB的往返,比如

public string OutStanding(string PC)
{
    var rawData = _context.MyTable.Where(w => w.debit == PC || w.credit == PC).ToList();
                                                          //^^ using OR operator 
    var d = rawData.Where(w => w.debit == PC).Sum(s => s.amount);
    var c = rawData.Where(w => w.credit== PC).Sum(s => s.amount);
    return (d - c).ToString();
}

您可以稍后应用查询和提取

public string OutStanding(string PC) {
    var myTable =_context.MyTable.Where(w => w.debit == PC || w.credit == PC).ToList();
    var d = myTable.Where(w => w.debit == PC).Sum(s => s.amount);
    var c = myTable.Where(w => w.credit == PC).Sum(s => s.amount);
    return (d - c).ToString(); 
}

您可以稍后应用查询和提取

public string OutStanding(string PC) {
    var myTable =_context.MyTable.Where(w => w.debit == PC || w.credit == PC).ToList();
    var d = myTable.Where(w => w.debit == PC).Sum(s => s.amount);
    var c = myTable.Where(w => w.credit == PC).Sum(s => s.amount);
    return (d - c).ToString(); 
}

我建议在单个查询中获得最终的差异

public string OutStanding(string PC)
{
    return _context.MyTable.Take(1).Select(x =>
        _context.MyTable.Where(w => w.debit == PC).Sum(s => s.amount) -
        _context.MyTable.Where(w => w.credit == PC).Sum(s => -s.amount)
    );
}
其思想是获得如下所示的SQL语句:

-- replace PC with the equivalent numeric value
SELECT (
    SELECT SUM(Amount) AS subtotal FROM MyTable WHERE debit = PC
) - (
    SELECT SUM(Amount) FROM MyTable WHERE credit = PC
)
虽然在SQL Server上看起来更像这样:

-- replace PC with the equivalent numeric value
SELECT TOP 1 (
    SELECT SUM(Amount) AS subtotal FROM MyTable WHERE debit = PC
) - (
    SELECT SUM(Amount) FROM MyTable WHERE credit = PC
) AS Difference
FROM MyTable

我建议在单个查询中获得最终的差异

public string OutStanding(string PC)
{
    return _context.MyTable.Take(1).Select(x =>
        _context.MyTable.Where(w => w.debit == PC).Sum(s => s.amount) -
        _context.MyTable.Where(w => w.credit == PC).Sum(s => -s.amount)
    );
}
其思想是获得如下所示的SQL语句:

-- replace PC with the equivalent numeric value
SELECT (
    SELECT SUM(Amount) AS subtotal FROM MyTable WHERE debit = PC
) - (
    SELECT SUM(Amount) FROM MyTable WHERE credit = PC
)
虽然在SQL Server上看起来更像这样:

-- replace PC with the equivalent numeric value
SELECT TOP 1 (
    SELECT SUM(Amount) AS subtotal FROM MyTable WHERE debit = PC
) - (
    SELECT SUM(Amount) FROM MyTable WHERE credit = PC
) AS Difference
FROM MyTable
您可以尝试以下方法:

return _context.MyTable.
          Where(w => w.debit == PC || w.credit == PC).
          Sum(s => w.credit == PC ? -s.amount : s.amount).ToString();
但是检查生成的sql。根据EF的版本和使用的数据库,这可能会在客户端上进行评估。

您可以尝试以下方法:

return _context.MyTable.
          Where(w => w.debit == PC || w.credit == PC).
          Sum(s => w.credit == PC ? -s.amount : s.amount).ToString();


但是检查生成的sql。根据EF的版本和使用的数据库,这可能会在客户端上进行评估。

我希望在一个查询中获得两个总和,而不是查询大数据并对其执行两个总和。只要您没有使用,这仍然是对数据库的两个查询。ToList介于两者之间,或者调用AsEnumerable以强制使用Enumerable。在查询中的何处。我希望在一个查询中获取两个总和,而不是查询大数据并对其执行两个总和。这仍然是对数据库的两个查询,只要您没有使用。ToList介于两者之间,或调用AsEnumerable强制使用Enumerable。查询的位置。您将如何执行此操作?您发布的内容需要位于comments@Bharathi更新了。@sriharsha更新了。@vasily.sib事实上,.Concat是这里比较合适的选择。你会怎么做?你发布的内容需要在comments@Bharathi更新。@sriharsha Updated.@vasily.sib事实上,.Concat是这里更合适的选择。我想您需要在.Where和.Sum调用之间调用.ToList:\@vasily.sib为什么?整个总和在一个数据库调用中检索。@ZevSpitz我不确定LINQ to Entities是否可以处理这个。总和call@vasily.sib问题不在于求和,而在于表达式中的三元if,if,if,any。@ZevSpitz这正是我所担心的。如果您在此之前调用.ToList.Sum,它将由LINQ to Objects处理,此代码肯定会正常工作。我认为您需要在.Where和.Sum调用之间调用.ToList:\@vasily.sib为什么?整个总和在一个数据库调用中检索。@ZevSpitz我不确定LINQ to Entities是否可以处理这个。总和call@vasily.sib问题不在于求和,而在于表达式中的三元if,if,if,any。@ZevSpitz这正是我所担心的。如果在此之前调用.ToList.Sum,它将由LINQ处理到对象,并且此代码肯定会正常工作。这仍然不如可能的效率高。它迫使EF提取构建MyTable中所有实体所需的所有数据,而我们实际需要的只是一个数字。这仍然不如它可能的那么有效。这迫使EF提取构建MyTable中所有实体所需的所有数据,而实际上我们只需要一个数字。,