OData 服务内存不足异常

本文关键字:异常 内存不足 服务 OData | 更新日期: 2023-09-27 17:56:50

我在Web Api V2下有一个OData服务构建。我有一个带有 Linq 查询的控制器,用于从表中返回数据。这是控制器查询:

    [EnableQuery]
    public IQueryable<ImportContracts_ImportContracts> Get()
    {
        IQueryable<ImportContracts_ImportContracts> query = new List<ImportContracts_ImportContracts>().AsQueryable();
        query = (from BRRIMPORTCONTRACTS imcon in db.BRRIMPORTCONTRACTS.Where(x => x.ZZSTATE == 0)
                 select new
                 {
                     ReferenceDateData = imcon.ReferenceDate,
                     ImportationDate = imcon.ImportationDate,
                     LastImportation = imcon.LastImportation
                 }).ToList().Select(x => new ImportContracts_ImportContracts
                 {
                     ReferenceDateData = x.ReferenceDateData,
                     ImportationDate = x.ImportationDate,
                     LastImportation = x.LastImportation
                 }).AsQueryable();
        return query;
    }

我的表 BRRM 导入合同有 100 万条记录。当我到达这里时,我得到了一个System.OutOfMemoryException。

我知道这可能不是查询实体的最佳方式,但我只是想要一个解决方法。

我尝试过[EnableQuery(PageSize=10)]提示,但没有成功。我认为问题出在查询本身。

提前谢谢。菲利佩

OData 服务内存不足异常

这有什么不同吗?

[EnableQuery]
public IQueryable<ImportContracts_ImportContracts> Get()
{
    IQueryable<ImportContracts_ImportContracts> query = new List<ImportContracts_ImportContracts>().AsQueryable();
     query = (from BRRIMPORTCONTRACTS imcon in db.BRRIMPORTCONTRACTS.Where(x => x.ZZSTATE == 0)
         .Select(x => new ImportContracts_ImportContracts
         {
             ReferenceDateData = x.ReferenceDate,
             ImportationDate = x.ImportationDate,
             LastImportation = x.LastImportation
         });
    return query;
}

请注意,您的 ToList() 消失了,因此返回了一个 IQueryable。这有帮助吗?

例如,您可以自己应用查询吗

public IQueryable<ImportContracts_ImportContracts> Get(ODataQueryOptions<..> options)
{
    IQueryable<ImportContracts_ImportContracts> query = new List<ImportContracts_ImportContracts>().AsQueryable();
     // use the options to apply
     ...   
     return query;
}