LINQ Group Join中使用Where子句时无法访问关联表字段的问题
解决LINQ分组连接中无法访问
b变量的问题 这个问题我之前也碰到过,核心是**分组连接(join ... into)**的特性导致的:当你用into把匹配的SubCategory记录打包成grpDetail集合后,原来的单个b变量就不在当前作用域里了,自然没法在where子句中访问它。下面根据不同的需求给你两种正确的写法:
需求1:只保留存在满足条件子类别的分类,分组包含所有关联子类别
如果你想筛选出「至少有一个关联的SubCategory满足CategoryModel != SubCategoryModel」的Category,同时分组里保留该分类下所有的子类别,可以在where里通过grpDetail集合来判断:
from a in Category join b in SubCategory on a.CategoryID equals b.CategoryID into grpDetail // 用Any判断分组中是否存在满足条件的子类别 where grpDetail.Any(s => a.CategoryModel != s.SubCategoryModel) select new { Id = a.CategoryID, Count1 = grpDetail.Count(o=>o.OtherColumn1 == 1), // 其他需要的字段... }
对应你的数据表,这个查询会保留CategoryID=1(因为Book1满足条件),而CategoryID=2(所有子类别模型和分类模型一致)、CategoryID=3(无关联子类别)会被过滤掉。
需求2:分组只包含满足条件的子类别
如果你想让grpDetail里只保留满足CategoryModel != SubCategoryModel的子类别记录,可以先过滤SubCategory再做连接:
from a in Category // 先筛选出当前分类下满足条件的子类别,再做连接 join b in SubCategory.Where(s => a.CategoryModel != s.SubCategoryModel) on a.CategoryID equals b.CategoryID into grpDetail select new { Id = a.CategoryID, Count1 = grpDetail.Count(o=>o.OtherColumn1 == 1), // 其他需要的字段... }
这种写法里,CategoryID=1的grpDetail只会包含Book1(Book2因模型一致被过滤),所以Count1为0;CategoryID=2和CategoryID=3的grpDetail是空集合,Count1也为0。
内容的提问来源于stack exchange,提问作者DooDoo
相关产品推荐
相关产品推荐

