从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的唯一原因,因此欢迎使用可以实现自动查询选项的替代选项。
答案 0 :(得分:2)
IEnumerable枚举10次,因为应用了默认orderby。
此行为是设计使然,因为$ top需要稳定排序。
如果您不想这样,可以将EnsureStableOrdering设置为false。
[EnableQuery(EnsureStableOrdering = false)]
public IEnumerable<SomeType> Get()
{
return GetSomeTypes().Take(2);
}