Entity Framework Core 5.0条件Linq表达式条件部分不生效如何解决
问题原因
- EF Core 所有
IQueryable类型的链式查询方法(Where、OrderBy、Take等)都不会修改原查询对象,而是返回应用了对应逻辑的新IQueryable实例。 - 你的代码中调用
OrderBy和Take后没有将返回的新实例赋值给peopleQuery变量,原查询始终只包含Where条件,因此生成的SQL没有排序和条数限制逻辑。你之前调用ToList不生效也是因为执行的是未修改的原查询。
修正代码
仅需在条件分支中增加赋值操作即可,无重复代码:
public IEnumerable<Person> GetPeople(int age, int limitCount) { IQueryable<Person> peopleQuery = _context.people.Where(p => p.Age == age); if (limitCount > 0) // 把应用了排序、取数逻辑的新查询对象赋值回原变量 peopleQuery = peopleQuery.OrderBy(p => p.DateAddedUTC).Take(limitCount); System.Diagnostics.Debug.WriteLine(peopleQuery.ToQueryString()); // 若需要在方法内完成查询,改为 return peopleQuery.ToList(); return peopleQuery; }
补充说明
如果希望方法返回后还能继续拼接数据库侧的查询条件,可以将返回值类型改为IQueryable<Person>;如果不需要后续拼接查询,建议直接调用ToList()在方法内完成查询,避免后续意外触发客户端内存计算。
内容的提问来源于stack exchange,提问作者Phil G
相关产品推荐
相关产品推荐

