在OData URL Query上启用延迟加载

时间:2014-07-06 14:46:07

标签: c# odata lazy-loading asp.net-web-api2

从Web API Endpoint OData Query返回IEnumerable时,它会枚举\在应用查询选项之前执行急切加载。 这就是我的意思:

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的唯一原因,因此欢迎使用可以实现自动查询选项的替代选项。

1 个答案:

答案 0 :(得分:2)

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

此行为是设计使然,因为$ top需要稳定排序。

如果您不想这样,可以将EnsureStableOrdering设置为false。

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