在OData URL查询上启用延迟加载

本文关键字:启用 延迟加载 查询 OData URL | 更新日期: 2023-09-27 18:11:34

似乎当从Web API Endpoint OData查询返回IEnumerable时,它在应用查询选项之前枚举' does eager loading。我的意思是:

SomeType:

public class SomeType
{
    public int SomeProp { get; set; }
}
端点:

public class SomeTypeController : ApiController
{
    [EnableQuery]
    public IEnumerable<SomeType> Get()
    {
        return GetSomeTypes();
    }
    IEnumerable<SomeType> GetSomeTypes()
    {
        for (var i = 0; i < 10; i++)
        {
            Trace.WriteLine(i);
            yield return new SomeType { SomeProp = i };
        }
    }
}

请求/api/sometype?$top=2时,我希望跟踪2行(0,1),但我看到循环一直持续到末尾。

我期望在返回之前调用Take(2)的行为相同:

端点:

public class SomeTypeController : ApiController
{
    [EnableQuery]
    public IEnumerable<SomeType> Get()
    {
        return GetSomeTypes().Take(2);
    }
    IEnumerable<SomeType> GetSomeTypes()
    {
        for (var i = 0; i < 10; i++)
        {
            Trace.WriteLine(i);
            yield return new SomeType { SomeProp = i };
        }
    }
}

是否有办法打开OData查询选项的延迟加载?

查询选项是我使用OData的唯一原因,因此可以实现自动查询选项的替代方案是受欢迎的。

在OData URL查询上启用延迟加载

IEnumerable枚举10次,因为应用了默认顺序。

这个行为是设计的,因为$top需要一个稳定的排序。

如果你不想这样,你可以把EnsureStableOrdering设置为false。

    [EnableQuery(EnsureStableOrdering = false)]
    public IEnumerable<SomeType> Get()
    {
        return GetSomeTypes().Take(2);    
    }