我试图从表中返回前1000行,但是使用EF Core,我在运行.Take(1000)之前获取了完整的数据集。
API
[HttpGet("MyThing/{id}")]
public List<MyObj> ItemsReport(long id)
{
response = new List<MyObj>();
response = _reporting.GetNewEntries(id);
return response;
}
报告
public virtual List<MyObj> GetNewEntries(long id)
{
var newEntries = new List<MyObj>();
var entries = _DbContext.ReportNewEntries
.OrderBy(a => long.Parse(a.Id))
.Where(a => long.Parse(a.Id) > id)
.Take(1000);
newEntries.AddRange(entries);
return newEntries;
}
DbContext
DbSet<MyObj> ReportNewEntries{ get; set; }
我想要的查询与此类似:
SELECT TOP (1000) *
FROM dbo.ReportNewEntries
WHERE CONVERT(bigint, Id) > 0
ORDER BY CONVERT(bigint, Id)
根据SQL事件探查器,我当前的查询是:
SELECT * FROM dbo.ReportNewEntries
表是整体的,因此我想一次访问1000行。对我犯什么错误有什么建议吗?
答案 0 :(得分:0)
使用List
时,您使用的是 Linq-To-Object ,它适用于IEnumerable
。
实际上,IEnumerable
会先将内存中的所有数据加载到应用Take之前。
您要使用的是IQueryable
,它是 Linq-to-Sql 。
因此,要么修改您的方法以返回IQueryable<MyObj>
,要么用AsQueryable()
调用Linq链,如下所示:
var entries = _DbContext.ReportNewEntries.AsQueryable()
.OrderBy(a => long.Parse(a.Id)).Where(a => long.Parse(a.Id) > id).Take(1000);
答案 1 :(得分:0)
您正在使用哪个数据库?什么版本的.NetCore?什么数据库提供商?一些数据库提供程序可能在将某些linq语句转换为sql时遇到问题。在这种情况下,将在数据库中运行其他查询(通常获取所有数据)并在内存中执行linq。