如何从配置文件设置OData控制器EnableQuery属性的PageSize?
解决OData EnableQuery属性动态获取配置中PageSize的问题
问题原因
属性的参数必须是编译时常量,你代码里的pageSize是实例字段,在运行时才通过构造函数赋值,编译阶段无法确定其值,所以直接在[EnableQuery(PageSize = pageSize)]中使用会失效。
解决方案一:自定义EnableQuery属性(推荐,支持控制器级别的自定义配置)
创建继承自EnableQueryAttribute的自定义属性,通过依赖注入获取配置并设置PageSize:
- 定义自定义属性
public class EnableQueryWithConfigAttribute : EnableQueryAttribute { public EnableQueryWithConfigAttribute(IOptions<Configurations> configurations) { // 将配置中的string类型PageSize转为int(EnableQuery的PageSize为int类型) PageSize = int.Parse(configurations.Value.PageSize); } }
- 修改控制器代码
public class PersonController : ODataController { private readonly IPersonService _personService; private readonly Configurations _configurations; private readonly ILoggingService _loggingService; public PersonController(IPersonService personService, IOptions<Configurations> configurations, ILoggingService loggingService) { _personService = personService; _configurations = configurations.Value; _loggingService = loggingService; } [HttpGet("/persons/")] [EnableQueryWithConfig] // 使用自定义属性替代原EnableQuery public ActionResult<IEnumerable<Person>> Get() { // 业务逻辑实现 return Ok(_personService.GetPersons()); } }
解决方案二:全局配置OData默认PageSize(适用于全局统一分页大小的场景)
在Program.cs/Startup.cs中配置OData全局查询特性,直接从配置读取PageSize:
var builder = WebApplication.CreateBuilder(args); // 注册配置类 builder.Services.Configure<Configurations>(builder.Configuration); // 配置OData builder.Services.AddControllers().AddOData(options => { // 启用常用查询特性 options.Select().Filter().OrderBy().Expand().Count().SetMaxTop(null); // 从配置获取PageSize并设置全局默认值 var config = builder.Services.BuildServiceProvider().GetRequiredService<IOptions<Configurations>>().Value; options.EnableQueryFeatures(int.Parse(config.PageSize)); }); var app = builder.Build(); // 其他中间件配置...
之后控制器只需添加[EnableQuery]即可自动使用全局配置的PageSize:
[HttpGet("/persons/")] [EnableQuery] public ActionResult<IEnumerable<Person>> Get() { // 业务逻辑实现 return Ok(_personService.GetPersons()); }
注意事项
- 原代码中
pageSize是string类型,而EnableQueryAttribute的PageSize是int类型,必须进行类型转换,避免运行时异常。 - 如果需要不同控制器使用不同的PageSize,优先选择方案一;如果全局统一,方案二更简洁。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

