【问题标题】:Select set of results (filter) using composite key ASP.NET Web API使用复合键 ASP.NET Web API 选择结果集(过滤器)
【发布时间】:2019-12-06 10:44:48
【问题描述】:

我有一个这种性质的表,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 |
+------+-------+------------------+------------------+

我想做的很简单,选择符合请求的行子集,例如,

?startyear=2016&endyear=2019&startmonth=1&endmonth=11

我已通过YearMonth 订购了此表,然后我按如下方式应用过滤器。

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();

当它被Month 过滤时,如果我提供上面的查询,2016 年第 12 个月和 2017 年将退出。我明白这其中的原因。

当我说startyear=2016startmonth=1 时,我的意思是从 2016 年的第 1 个月开始,所以两年的第 12 个月必须在结果中。在网上找不到任何有用的东西,有没有办法做到这一点?提前谢谢你。

【问题讨论】:

    标签: c# linq entity-framework-6 asp.net-web-api2


    【解决方案1】:

    您的 where 子句是错误的。您需要分别处理第一年和最后一年,例如:

    var result = balances
        .Where(x => 
            x.Year == startYear && x.Month >= startMonth ||
            x.Year > startYear && x.Year < endYear ||
            x.Year == endYear && x.Month <= endMonth);
    

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

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

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

    • 年份是年末,月份小于月底

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 2019-04-08
      • 2011-06-28
      • 2023-04-11
      相关资源
      最近更新 更多