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