【问题标题】:Enable lazy loading on OData URL Query在 OData URL 查询上启用延迟加载
【发布时间】:2014-07-06 14:46:07
【问题描述】:

似乎在从 Web API 端点 OData 查询返回 IEnumerable 时,它会枚举 \ 在应用查询选项之前进行预加载。 这就是我的意思:

某些类型:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 现在说得通了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-05-21
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多