使用OData 8.2.5与.NET 6时$select查询抛出IEdmModel异常
解决OData 8.2.5 + .NET 6中IQueryable配合$select抛出IEdmModel常量值异常的问题
问题重现
使用OData 8.2.5和.NET 6开发的MyType控制器,访问/odata/MyType可正常返回结果,但发起/odata/MyType?$select=Id请求时抛出异常:
System.NotSupportedException: Unable to create a constant value of type 'Microsoft.OData.Edm.IEdmModel'
将返回类型改为List<MyTypeEntity>并调用ToList()后,$select功能正常,但会加载全量数据到内存,不符合性能要求,需基于IQueryable实现分页/筛选。
解决方案
1. 确保EdmModel正确注册实体集
检查modelBuilder.GetEdmModel()的实现,必须显式添加对应实体集,且名称需与控制器名称匹配(控制器为MyTypeController,实体集名称应为MyType):
public IEdmModel GetEdmModel() { var builder = new ODataConventionModelBuilder(); // 关键:注册MyTypeEntity对应的实体集,名称与控制器一致 builder.EntitySet<MyTypeEntity>("MyType"); // 其他实体配置... return builder.GetEdmModel(); }
2. 给EnableQueryAttribute明确关联EdmModel
在控制器中注入IEdmModel,并在[EnableQuery]特性中指定模型,避免OData运行时无法推断实体类型:
using System; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.OData.Query; using Microsoft.AspNetCore.OData.Routing.Controllers; using Microsoft.OData.Edm; namespace MyProject.Controllers { public class MyTypeController : ODataController { private readonly string _apiKey; private readonly IEdmModel _edmModel; private readonly YourEntityDataContext _entityDataContext; // 替换为你的DbContext类型 public MyTypeController(IConfiguration configuration, IEdmModel edmModel, YourEntityDataContext entityDataContext) { _apiKey = configuration.GetValue<string>("apikey"); _edmModel = edmModel; _entityDataContext = entityDataContext; } [HttpGet] // 显式指定EdmModel,解决类型推断问题 [EnableQuery(Model = nameof(_edmModel))] public IQueryable<MyTypeEntity> Get() { return _entityDataContext.Set<MyTypeEntity>(); } } }
3. 避免泛型方法导致的类型推断歧义
如果BuildFilteredDbSet是泛型方法,调用时需显式指定实体类型,确保返回的IQueryable类型明确:
// 修正后的调用方式 return BuildFilteredDbSet<MyTypeEntity>();
原因分析
该异常通常源于OData无法正确关联EdmModel与返回的IQueryable实体类型:
- 若EdmModel未注册对应实体集,OData无法识别控制器返回的实体,处理$select时会尝试传递IEdmModel作为常量值,引发异常;
- 泛型方法返回的IQueryable
在运行时可能导致OData无法推断具体实体类型,需显式指定EdmModel或实体类型; - 使用
ToList()后,数据已加载到内存,OData直接在内存集合上处理筛选,绕过了LINQ查询转换时的模型关联逻辑,因此不会触发异常。
内容的提问来源于stack exchange,提问作者avenmia
相关产品推荐
相关产品推荐

