c使用Sum进行多次比较的lambda表达式

本文关键字:比较 lambda 表达式 使用 Sum | 更新日期: 2023-09-27 18:27:28

我试图在lambda表达式中使用Sum方法进行比较,但我想将其用于多次比较。我该如何做到这一点?我看过"Let"answers"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);

正如您所看到的,我正在尝试获取所有具有特定条件的表,这些表具有具有特定条件且其宽度加起来都小于某个值的Legs。我还想确保总和大于某个最小值。然而,我不能在这里这么做,因为我一这么做。总之,我失去了这份名单。那么,我该如何在这里做到这一点呢?我只想要minValue<=。Sum()<=最大值

c使用Sum进行多次比较的lambda表达式

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

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;

要获得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();

我注意到,这只是检查的宽度总和——我不相信这是你想要的,但这是你目前正在做的。