Select 使用复合键的结果集(过滤器)ASP.NET Web API
Select set of results (filter) using composite key ASP.NET Web API
我有一个table这种性质的,Year
和Month
一起创建一个组合键
+------+-------+------------------+------------------+
| Year | Month | Numeric Column 1 | Numeric Column 2 |
+------+-------+------------------+------------------+
| 2016 | 12 | 455 | 56600 | <
| 2017 | 11 | 10.56 | 98000 |
| 2017 | 12 | 45.2 | 56422.5 | <
| 2018 | 1 | 550 | 12200 |
| 2018 | 2 | 440 | 52000 |
| 2018 | 3 | 0 | 11 |
| 2018 | 4 | 0 | 11 |
| 2019 | 1 | 123 | 4200 |
+------+-------+------------------+------------------+
我想做的很简单,select 符合请求的行子集,
?startyear=2016&endyear=2019&startmonth=1&endmonth=11
我已经通过 Year
和 Month
订购了这个 table,然后我按如下方式应用过滤器。
IQueryable<Balance> reportToReturn = _context.Balances.OrderBy(b => b.Year).ThenBy(b => b.Month).AsQueryable();
reportToReturn = reportToReturn.Where(b => b.Year >= report.StartYear && b.Year <= report.EndYear);
reportToReturn = reportToReturn.Where(b => b.Month >= report.StartMonth && b.Month <= report.EndMonth);
List<Balance> result = reportToReturn.ToList();
当它得到提供的 Year
范围内的相应结果后,会发生什么情况,当它被 Month
过滤时,例如,如果我提供上述查询,2016 年第 12 个月和 2017 年退出.我明白这是为什么。
当我说 startyear=2016
和 startmonth=1
时,我的意思是从 2016 年的第 1 个月开始,所以这两年的第 12 个月都必须在结果中。在网上找不到任何有用的东西,有没有办法实现这一目标?提前谢谢你。
你的 where 子句是错误的。您需要分别处理第一年和最后一年,例如:
var result = balances
.Where(x =>
x.Year == startYear && x.Month >= startMonth ||
x.Year > startYear && x.Year < endYear ||
x.Year == endYear && x.Month <= endMonth);
为了解释逻辑,您需要所有项目,其中:
- 年份是开始年份且月份大于开始月份
或
- 年份大于开始年份且年份小于结束年份
或
- 年份是结束年份且月份小于结束月份
我有一个table这种性质的,Year
和Month
一起创建一个组合键
+------+-------+------------------+------------------+
| Year | Month | Numeric Column 1 | Numeric Column 2 |
+------+-------+------------------+------------------+
| 2016 | 12 | 455 | 56600 | <
| 2017 | 11 | 10.56 | 98000 |
| 2017 | 12 | 45.2 | 56422.5 | <
| 2018 | 1 | 550 | 12200 |
| 2018 | 2 | 440 | 52000 |
| 2018 | 3 | 0 | 11 |
| 2018 | 4 | 0 | 11 |
| 2019 | 1 | 123 | 4200 |
+------+-------+------------------+------------------+
我想做的很简单,select 符合请求的行子集,
?startyear=2016&endyear=2019&startmonth=1&endmonth=11
我已经通过 Year
和 Month
订购了这个 table,然后我按如下方式应用过滤器。
IQueryable<Balance> reportToReturn = _context.Balances.OrderBy(b => b.Year).ThenBy(b => b.Month).AsQueryable();
reportToReturn = reportToReturn.Where(b => b.Year >= report.StartYear && b.Year <= report.EndYear);
reportToReturn = reportToReturn.Where(b => b.Month >= report.StartMonth && b.Month <= report.EndMonth);
List<Balance> result = reportToReturn.ToList();
当它得到提供的 Year
范围内的相应结果后,会发生什么情况,当它被 Month
过滤时,例如,如果我提供上述查询,2016 年第 12 个月和 2017 年退出.我明白这是为什么。
当我说 startyear=2016
和 startmonth=1
时,我的意思是从 2016 年的第 1 个月开始,所以这两年的第 12 个月都必须在结果中。在网上找不到任何有用的东西,有没有办法实现这一目标?提前谢谢你。
你的 where 子句是错误的。您需要分别处理第一年和最后一年,例如:
var result = balances
.Where(x =>
x.Year == startYear && x.Month >= startMonth ||
x.Year > startYear && x.Year < endYear ||
x.Year == endYear && x.Month <= endMonth);
为了解释逻辑,您需要所有项目,其中:
- 年份是开始年份且月份大于开始月份
或
- 年份大于开始年份且年份小于结束年份
或
- 年份是结束年份且月份小于结束月份