OData v4 的 Web Api 在 $select 上抛出异常

2024-03-16

我正在使用最新版本的 WebApi 和 OData,一切设置都可以正常工作。唯一的问题是当我尝试使用 $select 时。

它会抛出以下错误

  Object of type 'System.Linq.EnumerableQuery`1[System.Web.OData.Query.Expressions.SelectExpandBinder+SelectAll`1[WebApplication1.Controllers.Person]]' cannot be converted to type 'System.Collections.Generic.IEnumerable`1[WebApplication1.Controllers.Person]'.

我查看了文档,他们的建议是使用[Queryable]在控制器中的 Get 方法或 WebApiConfig 中使用config.EnableQuerySupport并且这些都不是可用的选项。我目前正在使用[EnableQuery]

EDIT

Odata控制器:

    using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.OData;
using System.Xml.Serialization;

namespace WebApplication1.Controllers
{
    public class PeopleController : ODataController
    {
        // GET api/values
        [EnableQuery]
        public IQueryable<Person> Get()
        {
            return new Person[] { new Person()
            {
                Id = 1,
                FirstName = "Testing",
                LastName = "2"
            },  new Person()
            {
                Id = 2,
                FirstName = "TestTest",
                LastName = "3"
            } }.AsQueryable();
        }

        // GET api/values/5
        public Person Get(int id)
        {
            return new Person()
            {
                Id = 3,
                FirstName = "Test",
                LastName = "1"
            };
        }

        // POST api/values
        public void Post([FromBody]Person value)
        {
        }

        // PUT api/values/5
        public void Put(int id, [FromBody]Person value)
        {
        }

        // DELETE api/values/5
        public void Delete(int id)
        {
        }
    }

    public class Person
    {
        [Key]
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

WebApi配置

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.OData;
using System.Web.OData.Builder;
using System.Web.OData.Extensions;
using System.Web.OData.Formatter;
using WebApplication1.Controllers;

namespace WebApplication1
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            var odataFormatters = ODataMediaTypeFormatters.Create();
            config.Formatters.InsertRange(0, odataFormatters);

            ODataModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<Person>("People");
            config.AddODataQueryFilter();
            config.MapODataServiceRoute(
            routeName: "ODataRoute",
            routePrefix: "api",
            model: builder.GetEdmModel());

        }
    }
}

UPDATE 2

似乎只在检索 xml 格式的数据时抛出错误。 Json 似乎可以工作


这是 System.Net.Formatting Nuget 包中的 XmlMediaTypeFormatter 类的已知限制。 JSON 格式化程序的实现确实支持 $select 和 $expand 命令,但当内容协商确定应返回 XML 时,这些命令不可用。

如果您需要返回 XML 格式的响应,您应该考虑实现 OData 端点(而不是 WebAPI 端点)。有关如何完成此操作的更多信息可以在此处找到:

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OData v4 的 Web Api 在 $select 上抛出异常 的相关文章

随机推荐

  • 使用四元数的最近邻

    给定一个四元数值 我想在一组四元数中找到它的最近邻居 为此 我显然需要一种方法来比较两个四元数之间的 距离 这种比较需要什么距离表示以及如何计算 Thanks Josh 这是一个老问题 但似乎需要更多答案 如果四元数是用于表示旋转的单位长度
  • 如何找出网页浏览者每英寸的像素数?

    谁能想到一种方法来发现用户的每英寸像素数 我想确保图像显示在网络浏览器中exactly我需要它的大小 因此使用分辨率 我可以从用户代理获得 和每英寸像素的组合我可以做到这一点 但是 我不确定是否有任何方法可以发现用户的每英寸像素数 最好使用
  • jQuery UI Multiple Droppable - 拖动整个 div 元素并克隆

    我刚刚开始使用 jQuery UI 将 div 拖到表中的列中 我有几个不同的可拖动 div 其中有不同的背景颜色和文本 并且我需要它们能够作为克隆拖动到放置区域 通过使用 jQuery UI 的示例购物车代码 效果很好 但我对其进行了编辑
  • 延迟加载+同位素

    我花了相当多的时间试图让同位素和延迟加载一起工作 问题 如果用户向下滚动 则延迟加载有效 但是如果用户使用过滤器 项目会显示在顶部 但图像不会加载 这是有人遇到同样的问题 但似乎他已经解决了 我尝试了几件事但仍然无法让它工作 这是讨论htt
  • 通过按 JButton 运行外部 jar 文件

    我正在尝试运行一个 jar 文件 该文件位于与按下 JButton 不同的目录中 我有按钮和 GUI 设置 但我不知道如何启动单独的 jar 文件 我在这段代码块中放置了什么 private void jButton1MouseReleas
  • Gradle 构建错误:SAXParseException

    在构建应用程序时 我收到以下错误 Error org xml sax SAXParseException lineNumber 0 columnNumber 0 cvc pattern valid Value build tools 23
  • 加载多个 YAML 文件(使用@ConfigurationProperties?)

    使用 Spring Boot 1 3 0 RELEASE 我有几个 yaml 文件 它们描述了程序的多个实例 我现在想将所有这些文件解析为List
  • d3.js 强制取消拖动事件

    我有一个简单的拖动事件 如果满足特定条件 我想强制取消当前正在进行的拖动 基本上就像您正在执行鼠标向上操作一样 像这样 var drag behavior d3 behavior drag on drag function if mycon
  • 错误:(230, 25) 错误:无法访问 com.google.android.gms.common.internal.safeparcel.zza 的 zza 类文件未找到

    package com example qpay currentlocation import android Manifest import android app AlertDialog import android content D
  • 如何扩展PDF页面大小以添加水印?

    我的网络应用程序签署 PDF 文档 我想让用户下载原始 PDF 文档 未签名 但在 pdf 文档的左边距添加图像和签名者 我在另一个网络应用程序中看到了这个想法 我也想这样做 当然我想使用 itext 库来做到这一点 我附上了两张图片 原始
  • 模拟Android查杀并重启服务

    我想模拟 android 杀死并重新启动我的服务 以测试当我收到空意图时会发生什么以及我需要做什么清理 恢复 这可能吗 public MyService extends Service Override public void onCrea
  • forkpty - 套接字

    我正在尝试开发一个简单的 telnet 服务器 守护进程 它必须在新的套接字连接上运行程序 这部分工作正常 但我必须将我的新进程关联到 pty 因为该进程具有一些终端功能 如 readline 我开发的代码是 其中socketfd是新输入连
  • 使用VB.net创建计划任务[重复]

    这个问题在这里已经有答案了 如何使用 VB NET 创建计划任务 单击按钮时从 vb net 程序填充计划任务字段 我现在什么都没有 也不知道是否可能 您必须围绕本机 COM 接口创建包装器 如果你不想自己做 你可以使用这个库https t
  • Add-AzureAccount -credential 没有像我希望的那样工作

    4 天前 2014 年 8 月 4 日 发布了 Azure Powershell 的新版本 其中包括一个新的 凭据Add AzureAccount cmdlet 上的参数 我正在尝试使用它 但显然我做错了什么 首先 我将密码存储在一个文件中
  • 此 glassfish 警告的含义:上下文路径与捆绑包不同

    我不太确定此错误消息表示什么 INFO visiting unvisited references INFO visiting unvisited references INFO visiting unvisited references
  • 如何在 KeyUp 上进行文本框回发?

    我有一个文本框 可以更改 OnTextChanged 事件中下拉列表的内容 当文本框失去焦点时 此事件似乎会触发 如何在按键或按键事件上实现此操作 这是我的代码的示例
  • 在 Laravel 中找不到模型

    Error PhotoController php 第 17 行出现 FatalErrorException 未找到类 App Http Controllers photo 此代码发生异常 gt a photo all PhotoContr
  • 从二叉搜索树中删除节点,haskell

    我正在制作一个 Haskell 函数来从二叉搜索树中删除一个节点 我知道根据儿童数量需要采取的行动的规则 目标家长有 没有孩子 删除 1 个孩子 替换为孩子 2 个子节点 找到右子树中的最小值并用该值替换该节点 然后 递归删除右子树中的最小
  • 如何获取/设置默认帧缓冲区的宽度和高度?

    我想知道我的默认帧缓冲区的尺寸 我读到将视口设置为特定值不会影响 设置帧缓冲区的尺寸 是否有任何 GL 要求 您无法通过 OpenGL 调用设置默认帧缓冲区的大小 它是窗口的大小 由窗口系统接口 例如Android上的EGL 控制 如果您想
  • OData v4 的 Web Api 在 $select 上抛出异常

    我正在使用最新版本的 WebApi 和 OData 一切设置都可以正常工作 唯一的问题是当我尝试使用 select 时 它会抛出以下错误 Object of type System Linq EnumerableQuery 1 System