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()<=最大值
听起来你想要这样的东西:
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();
我注意到,这只是检查的宽度总和——我不相信这是你想要的,但这是你目前正在做的。