我有一个非常简单的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的
答案 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;