【问题标题】:c# lambda expression using Sum for multiple comparisonsc# lambda 表达式使用 Sum 进行多重比较
【发布时间】:2012-03-10 01:02:29
【问题描述】:

我正在尝试在 lambda 表达式中使用 Sum 方法进行比较,但我想将其用于多重比较。我该如何做到这一点?我查看了“Let”和“SelectMany”,但找不到答案。

下面是代码的样子:

return _dbContext.All<Table>()
            .Where(table => table.CurrentLevel <= salesCriteria.MaxTableLevel)
            .Where(table =>  table.Leg
                            .Where(leg=> salesCriteria.StartDate <= leg.AddDate)
                            .Where(leg=> leg.AddDate <= salesCriteria.EndDate)
                            .Sum(leg => leg.Width) <= salesCriteria.MaxGoalAmount);

如您所见,我正在尝试获取具有特定条件的所有表格,这些表格具有具有特定条件的腿,并且其宽度加起来都小于某个值。我还想确保 Sum 大于某个最小值。但是,我不能在这里执行此操作,因为我一执行 .Sum,就会丢失列表。那么我将如何在这里实现呢?我想要的只是 minValue

【问题讨论】:

  • 您想在应用其他条件之前将总和应用到满足您先前定义的标准的一组边,还是应用到整个边集?

标签: c# linq lambda


【解决方案1】:

听起来你想要这样的东西:

return _dbContext.All<Table>()
        .Where(table => table.CurrentLevel <= salesCriteria.MaxTableLevel)
        .Select(table => new { 
           table, 
           legWidth = table.Leg
                           .Where(leg=> salesCriteria.StartDate <= leg.AddDate)
                           .Where(leg=> leg.AddDate <= salesCriteria.EndDate)
                           .Sum(leg => leg.Width)
        })
        .Where(x => x.legWidth <= salesCriteria.MaxGoalAmount &&
                    x.legWidth >= salesCriteria.MinGoalAmount)
        .Select(x => x.table);

所以这里的Select 相当于在查询表达式中使用let

作为查询表达式,这将是:

return from table in _dbContext.All<Table>()
       where table.CurrentLevel <= salesCriteria.MaxTableLevel
       let legWidth = table.Leg
                           .Where(leg=> salesCriteria.StartDate <= leg.AddDate)
                           .Where(leg=> leg.AddDate <= salesCriteria.EndDate)
                           .Sum(leg => leg.Width)
       where legWidth <= salesCriteria.MaxGoalAmount &&
             legWidth >= salesCriteria.MinGoalAmount
       select table;

【讨论】:

    【解决方案2】:

    要获得let 的强大功能,您需要从方法链接语法切换到查询表达式语法。试试这个:

    var goodTables = 
        from table in _dbContext.All<Table>()
        where table.CurrentLevel <= salesCriteria.MaxTableLevel
        let sumOfWidthOfGoodLegs = 
            table.Leg
            .Where(leg=> salesCriteria.StartDate <= leg.AddDate)
            .Where(leg=> leg.AddDate <= salesCriteria.EndDate)
            .Sum(leg => leg.Width)    
        where sumOfWidthOfGoodLegs <= salesCriteria.MaxGoalAmount
        // can insert another where on sumOfWidthOfGoodLegs here as required
        select table;
    
    return goodTables.ToList();
    

    我注意到这是在检查只有好条腿的宽度和 - 我不相信这是你想要的,但这是你目前正在做的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 2010-11-28
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      相关资源
      最近更新 更多