.NET 6中如何基于条件为LINQ查询添加Include?
问题原因与解决方法
核心问题
- LINQ方法无副作用:
Include这类LINQ方法不会修改原查询对象,而是返回一个包含关联查询逻辑的新查询对象。你之前仅调用fruits.Include(...)但未将返回值重新赋值给fruits,原查询完全没变化,Include自然不生效。 - 类型不匹配导致赋值报错:初始声明的
fruits是IQueryable<Fruit>,但Include返回的是IIncludableQueryable<Fruit, 关联实体类型>(比如第一个Include返回IIncludableQueryable<Fruit, Taste>),直接赋值会因类型不一致报错。
解决代码
用var声明初始查询,让编译器自动推断后续类型变化,赋值就不会有问题:
var fruits = context.Fruits .Where(w => w.ColorId == colorId && Status.Contains(w.Status)) .OrderBy(ob => ob.FruitName).ThenBy(tb1 => tb1.FruitName); // 修正拼写错误:FiruitName → FruitName if(model.Red) { fruits = fruits.Include(i => i.Taste); } if(model.Blue) { fruits = fruits.Include(i => i.Sour) .ThenInclude(i => i.Sweet); } var fruitList = fruits.ToList();
补充说明
如果一定要显式声明类型,可将fruits声明为IQueryable<Fruit>,赋值时做显式转换(但用var更简洁):
IQueryable<Fruit> fruits = context.Fruits .Where(w => w.ColorId == colorId && Status.Contains(w.Status)) .OrderBy(ob => ob.FruitName).ThenBy(tb1 => tb1.FruitName); if(model.Red) { fruits = fruits.Include(i => i.Taste) as IQueryable<Fruit>; } // 蓝色条件同理
内容的提问来源于stack exchange,提问作者TheFallenOne
相关产品推荐
相关产品推荐

