Select 使用复合键的结果集(过滤器)ASP.NET Web API

Select set of results (filter) using composite key ASP.NET Web API

我有一个table这种性质的,YearMonth一起创建一个组合键

+------+-------+------------------+------------------+
| 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

我已经通过 YearMonth 订购了这个 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=2016startmonth=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);

为了解释逻辑,您需要所有项目,其中:

  • 年份是开始年份且月份大于开始月份

  • 年份大于开始年份且年份小于结束年份

  • 年份是结束年份且月份小于结束月份