Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 为什么在实体框架DBContext中使用OData选项时缺少客户端结果?_C# 4.0_Entity Framework 5_Odata - Fatal编程技术网

C# 4.0 为什么在实体框架DBContext中使用OData选项时缺少客户端结果?

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

假设OData和Entity Framework能够很好地协同工作,OData选项将被传递到EF db上下文以过滤查询,即只返回从服务器请求的记录数,而不是过滤所有记录

给定以下URL路径:

/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;
}