如何在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
相关产品推荐
相关产品推荐

