ASP.NET Core API中EF Core查询返回类型不匹配及多结果过滤问题
问题解决:ASP.NET Core控制器返回过滤后的集合数据
错误原因
你的第二个Get方法声明返回单个wareh_KPI_IN实体,但Where方法执行后返回的是符合条件的实体集合(类型为IQueryable<wareh_KPI_IN>,实现了IEnumerable<wareh_KPI_IN>),两者类型不匹配,因此触发编译错误。添加FirstOrDefault()会仅返回第一个匹配项,不符合你获取所有符合条件数据的需求。
修正方案
只需将第二个Get方法的返回类型改为集合类型,并保持查询逻辑即可。同时推荐使用异步方法提升Web应用性能,以下是两种实现方式:
1. 同步版本
using ESM_DASHBOARD.Data; using ESM_DASHBOARD.Data.Entities; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace ESM_DASHBOARD.Controllers { [Route("[controller]")] [ApiController] public class wareh_KPI_INController : ControllerBase { private readonly EsmDashboardContext _esmDashboardContext; public wareh_KPI_INController(EsmDashboardContext esmDashboardContext) { _esmDashboardContext = esmDashboardContext; } [HttpGet] public IEnumerable<wareh_KPI_IN> Get() { return _esmDashboardContext.wareh_KPI_IN; } // 修改返回类型为集合,并调整参数命名符合C#规范 [HttpGet("{weekNb}")] public IEnumerable<wareh_KPI_IN> Get(int weekNb) { return _esmDashboardContext.wareh_KPI_IN.Where(s => s.Week_nb == weekNb); } } }
2. 推荐异步版本(ASP.NET Core异步优先)
using ESM_DASHBOARD.Data; using ESM_DASHBOARD.Data.Entities; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Threading.Tasks; namespace ESM_DASHBOARD.Controllers { [Route("[controller]")] [ApiController] public class wareh_KPI_INController : ControllerBase { private readonly EsmDashboardContext _esmDashboardContext; public wareh_KPI_INController(EsmDashboardContext esmDashboardContext) { _esmDashboardContext = esmDashboardContext; } [HttpGet] public async Task<IEnumerable<wareh_KPI_IN>> Get() { return await _esmDashboardContext.wareh_KPI_IN.ToListAsync(); } [HttpGet("{weekNb}")] public async Task<IEnumerable<wareh_KPI_IN>> Get(int weekNb) { // 使用ToListAsync()将数据加载到内存,避免延迟执行可能引发的上下文释放问题 return await _esmDashboardContext.wareh_KPI_IN.Where(s => s.Week_nb == weekNb).ToListAsync(); } } }
额外注意事项
- 参数命名建议遵循C#小驼峰规范(如
weekNb替代Week_nb),提升代码可读性 - 异步方法中使用
ToListAsync()而非直接返回IQueryable,可以避免后续操作时上下文已被释放的问题,同时确保数据立即加载到内存 - 实体类和控制器名建议遵循帕斯卡命名法(如
WarehKpiIn替代wareh_KPI_IN),符合.NET生态的编码规范
内容的提问来源于stack exchange,提问作者Red bad coder
相关产品推荐
相关产品推荐

