C#web api返回错误的数据量

时间:2017-06-02 18:41:17

标签: c# asp.net asp.net-web-api2

我有一个非常简单的webapi,返回错误的数据量,API非常简单,我只是不知道如何发生这种情况,控制器代码如下:

[HttpGet("{TillID}")]
public IEnumerable<object> Get(int tillID, int StartAtRow=0, int TakeNoOfRows=1000)
{
    string hmCompanyId;
    string languageName;
    PrepareParameter(tillID, out hmCompanyId, out languageName);

    var tillData = from tbd in _context.TillBasicData.OrderBy(i => i.ItemId).Skip(StartAtRow).Take(TakeNoOfRows)
                   where tbd.CompanyId == hmCompanyId && tbd.languageCode == languageName
                   select tbd;

    return tillData.ToList();
}

如果我使用以下URL调用API,我会期望10行数据,但我只得到3

https://host.domain.zzz:5443/api/till/tilldata/1?StartAtRow=1&TakeNoOfRows=10

类似如果我使用以下URL我会期望20行,但我得到5

https://host.domain.zzz:5443/api/till/tilldata/1?StartAtRow=1&TakeNoOfRows=20

手动查询数据库显示数据库中的数据是正确的。

为什么我没有返回正确的行数?

编辑,以下SQL代码返回351443,其中where子句与控制器中的实际where子句匹配

select count(*) from tillbasicdata where CompanyId = 'BE_HM' and languageCode = 'eng'

编辑,服务器日志显示正在执行的查询看起来没问题,变量必须正确,因为如果我将行增加到100,那么我应该在URL 1中返回超过10的

1 个答案:

答案 0 :(得分:1)

问题在于您编写查询语句的顺序。你现在的方式就是订购表格,获取有序表格的前XXX,然后将过滤器应用于那些记录。

让我们说有100万条记录,你想要20个匹配过滤器。在现有查询中,您将获取未过滤数据表中的前20个,然后将过滤器应用于前20个,如果有任何匹配,您将会很幸运。

您想要的是将过滤器应用于表格中的所有数据,然后获取该过滤结果的前XXX位。

var tillData = _context.TillBasicData
                .Where(tbd => tbd.CompanyId == hmCompanyId && tbd.languageCode == languageName)
                .OrderBy(i => i.ItemId)
                .Skip(StartAtRow)
                .Take(TakeNoOfRows)
                .ToList();
return tillData;