完整数据集,而不是前1000名EF核心

时间:2019-05-16 10:17:59

标签: c# entity-framework .net-core entity-framework-core

我试图从表中返回前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行。对我犯什么错误有什么建议吗?

2 个答案:

答案 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。