C# 4.0 为什么在实体框架DBContext中使用OData选项时缺少客户端结果?
假设OData和Entity Framework能够很好地协同工作,OData选项将被传递到EF db上下文以过滤查询,即只返回从服务器请求的记录数,而不是过滤所有记录 给定以下URL路径:C# 4.0 为什么在实体框架DBContext中使用OData选项时缺少客户端结果?,c#-4.0,entity-framework-5,odata,C# 4.0,Entity Framework 5,Odata,假设OData和Entity Framework能够很好地协同工作,OData选项将被传递到EF db上下文以过滤查询,即只返回从服务器请求的记录数,而不是过滤所有记录 给定以下URL路径: /api/Users?$top=10&$skip=10 给定以下控制器操作: [Queryable(AllowedQueryOptions = AllowedQueryOptions.All)] public IEnumerable<USER> Get(ODataQue
/api/Users?$top=10&$skip=10
给定以下控制器操作:
[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
public IEnumerable<USER> Get(ODataQueryOptions<USER> options)
{
var dbContext = new ATMS.DAL.AtmsContext();
//var ret = options.ApplyTo(dbContext.USERS).Cast<USER>().ToArray(); // returns 10 rows but client sees 0
var ret = dbContext.USERS.ToArray(); // returns all records, filtered results to client
return ret;
}
如果未指定跳过,则返回前10个结果-显然对分页没有用处
使用ret=dbContext.USERS.ToArray()时
前10个结果和skip被正确应用,但这仅仅是因为所有结果都是从数据库返回的,并在之后应用过滤,这不是我想要实现的
在我的WebApiConfig.cs中,我有config.EnableQuerySupport()代码>
添加PageSize
属性无效:
[Queryable(AllowedQueryOptions = AllowedQueryOptions.All, PageSize = 10)]
返回IQueryable
也没有效果
返回PageResult
-无更改:
IQueryable results = options.ApplyTo(dbContext.USERS.AsQueryable(), settings);
return new PageResult<USER>(
results as IEnumerable<USER>,
Request.GetNextPageLink(),
Request.GetInlineCount());
IQueryable results=options.ApplyTo(dbContext.USERS.AsQueryable(),settings);
返回新页面结果(
结果是不可数的,
Request.GetNextPageLink(),
Request.GetInlineCount());
--更多信息--
使用/api/Users?$top=10&$skip=0
,如果我在操作方法的开头设置断点,并且在Visual Studio中调试时设置skip.RawValue并继续执行,我将获得预期的10个结果:
结果似乎受到了额外的跳过,这可能是没有显示结果的原因
当http://localhost:59337/api/Users?使用$top=10&$skip=9
,将显示第2页的最后一个结果-仅显示一个结果。
我缺少什么才能让它正常工作,还有其他人经历过吗?您不能混合匹配QueryableAttribute
和ODataQueryOptions
。根据您是希望手动控制查询选项的应用(ODataQueryOptions
)还是自动进行选择(QueryableAttribute
)
你有两个选择
public IEnumerable<USER> Get(ODataQueryOptions<USER> options)
{
var dbContext = new ATMS.DAL.AtmsContext();
var ret = options.ApplyTo(dbContext.USERS).Cast<USER>();
return ret;
}
public IEnumerable Get(ODataQueryOptions选项)
{
var dbContext=new ATMS.DAL.AtmsContext();
var ret=options.ApplyTo(dbContext.USERS.Cast();
返回ret;
}
或
[可查询]
公共IEnumerable Get(ODataQueryOptions选项)
{
var dbContext=new ATMS.DAL.AtmsContext();
var ret=dbContext.USERS;
返回ret;
}
您看到这种行为的原因是您应用了两次查询,一次是使用ODataQueryOptions.ApplyTo
,然后再次通过QueryableAttribute
进行查询,这很有道理,因为我怀疑查询是第二次应用的。非常感谢。
public IEnumerable<USER> Get(ODataQueryOptions<USER> options)
{
var dbContext = new ATMS.DAL.AtmsContext();
var ret = options.ApplyTo(dbContext.USERS).Cast<USER>();
return ret;
}
[Queryable]
public IEnumerable<USER> Get(ODataQueryOptions<USER> options)
{
var dbContext = new ATMS.DAL.AtmsContext();
var ret = dbContext.USERS;
return ret;
}