You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Entity Framework 4.0中使用IN子句筛选子分类

实现方案

1. Entity Framework 查询实现

方式一:对应SQL的子查询写法

直接用LINQ的Contains实现IN子查询逻辑,和原SQL逻辑完全对应:

var _db = new CatalogueContext();
// 先拿到目标父分类的ID列表
var parentIds = _db.Categories
                   .Where(c => c.CategoryName == "Super")
                   .Select(c => c.Id);
// 筛选父ID在这个列表里的子分类
var subCategories = _db.Categories
                       .Where(c => parentIds.Contains(c.ParentId));

嫌麻烦也可以合并成一行:

var _db = new CatalogueContext();
var subCategories = _db.Categories
                       .Where(c => _db.Categories
                                      .Where(p => p.CategoryName == "Super")
                                      .Select(p => p.Id)
                                      .Contains(c.ParentId));

方式二:用导航属性简化查询(推荐)

如果你的Category实体已经配置了父子导航属性(比如Children,通过EF的关联关系映射),可以直接这么写,逻辑更清晰:

var _db = new CatalogueContext();
var parentCategory = _db.Categories.FirstOrDefault(c => c.CategoryName == "Super");
// 直接取父分类的子分类,为空的话返回空列表
var subCategories = parentCategory?.Children ?? new List<Category>();

注:这种方式需要提前在EF里配置好分类表的父子关联,比如用Fluent API或者DataAnnotation标记外键关系

2. 绑定到Repeater控件

拿到子分类集合后,直接给Repeater赋值并绑定:

// 把subCategories替换成你实际查询到的集合
repeaterSubCategories.DataSource = subCategories;
repeaterSubCategories.DataBind();

原代码问题说明

你之前的代码只是筛选出了名称匹配的父分类本身,并没有查询它们的子分类,所以达不到预期效果:

// 这段代码仅获取了名称等于categoryName的分类,而非子分类
query = query.Where(p => String.Compare(p.CategoryName, categoryName) == 0);

内容的提问来源于stack exchange,提问作者Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:27:23