【问题标题】:Linq Query to sum only values above specific thresholdLinq 查询仅对高于特定阈值的值求和
【发布时间】:2019-08-14 16:52:42
【问题描述】:

我很难从列中分离出高于某个阈值的值。我只需要计算超过 100 英里的里程并将其乘以一个比率。例如,如果我一行有 101 英里,下一行有 102 英里,另一天有 103 英里,我想要的总和是 1*myrate + 2*myrate + 3*myrate

private void SetMiles()
    {
    int.TryParse(MDate.ToString("MM"), out int month);
    int.TryParse(MDate.ToString("yyyy"), out int year);

    TotalMiles = Decimal.Round(Convert.ToDecimal(MyTable
        .Where(a => a.Date <= MDate & a.Date.Month == MDate.Month & (a.Date.Year) == year & a.Miles > 100)
        .Select(a => a.Miles).Sum() * myrate), 2, MidpointRounding.AwayFromZero); 
    }       

以上内容无法正常工作,但这是我的出发点。我怎样才能实现我的目标并使其尽可能简单?

【问题讨论】:

    标签: c# entity-framework linq linq-to-sql


    【解决方案1】:

    更改您的Select 以获取差异:

    TotalMiles = Decimal.Round(Convert.ToDecimal(MyTable
        .Where(a => a.Date <= MDate && a.Date.Month == MDate.Month && (a.Date.Year) == year && a.Miles > 100)
        .Select(a => a.Miles - 100).Sum() * myrate), 2, MidpointRounding.AwayFromZero); 
    

    另请注意,您需要 &amp;&amp; 作为逻辑 AND 运算符

    【讨论】:

    • 这正是我所需要的。谢谢@mmathis。
    • &amp; 也是逻辑与运算符。
    【解决方案2】:

    你可以在你的班级里创建财产

    public int Value {
            get {
                if (Miles > 100)
                {
                    return (Miles - 100);
                }
                else
                {
                    return 0;
                }
    
            }
        }
    

    那就用这个

    select(a=>a.Value).Sum()*rate;
    

    因为那些不超过 100 的将返回 0,所以它们不会影响您的结果 最终代码将是

    TotalMiles = Decimal.Round(Convert.ToDecimal(MyTable
    .Where(a => a.Date <= MDate && a.Date.Month == MDate.Month && (a.Date.Year) == year)
    .select(a=>a.Value).Sum() * myrate), 2, MidpointRounding.AwayFromZero); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-14
      • 2022-08-23
      • 2013-03-02
      • 2021-09-25
      • 2021-05-22
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      相关资源
      最近更新 更多