You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6 WebAPI中OData $select查询请求无响应问题排查

问题分析与解决方案

核心问题:缺少OData EDM模型注册

你当前的配置仅启用了OData查询功能,但没有为MyType注册EDM(Entity Data Model)模型。$select这类需要依赖元数据识别实体属性的查询操作,会因为缺少模型定义,导致OData在处理投影时无法正确解析,进而出现请求挂起的情况——虽然Get方法返回了IQueryable,但后续的OData查询处理/序列化环节无法完成。

修复步骤

1. 创建并注册OData EDM模型

首先添加生成EDM模型的方法,可放在Program.cs或单独的模型类中:

using Microsoft.OData.Edm;
using Microsoft.OData.ModelBuilder;

public static IEdmModel GetEdmModel()
{
    var modelBuilder = new ODataConventionModelBuilder();
    // 将MyType注册为OData实体集,名称需与控制器名匹配(ExtendedController对应实体集名Extended)
    modelBuilder.EntitySet<MyType>("Extended");
    return modelBuilder.GetEdmModel();
}

然后在Program.cs的OData配置中添加模型:

builder.Services.AddControllers()
    .AddOData(options =>
        options.EnableQueryFeatures(null)
               // 注册EDM模型,指定路由前缀与控制器路由匹配
               .AddModel("ext", GetEdmModel()))
    .AddNewtonsoftJson(options =>
        options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

2. 调整控制器路由(可选但推荐)

OData控制器推荐使用OData路由约定,可保留原有[Route]或改用OData专属路由特性,确保与模型匹配:

[Authorize]
[ODataRoutePrefix("Extended")]
public class ExtendedController : ODataController
{
    private readonly IExtendedManager<MyType> _myTypeExtManager;
    private readonly ILogger<ExtendedController> _logger;

    public ExtendedController(IExtendedManager<MyType> myTypeExtManager,
                                ILogger<ExtendedController> logger)
    {
        _myTypeExtManager = myTypeExtManager;
        _logger = logger;
    }

    [HttpGet]
    [EnableQuery]
    [ODataRoute]
    public IQueryable<MyType> Get()
    {
        return _myTypeExtManager.GetAll();
    }
}

3. 验证查询操作

重启项目后,调用带$select的请求测试,例如:
GET /ext/Extended?$select=Property1,Property2

此时OData可基于EDM模型正确解析$select,生成对应的EF Core投影查询,不会再出现请求挂起的情况。


内容的提问来源于stack exchange,提问作者ImproveSoftware

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:42:10