多对多关联的Country与Region表连接后,如何获取匹配记录计数?
解决Linq关联查询计数的问题
首先得指出你当前写的Join语句存在语法逻辑问题哦——Join方法的第二、第三个参数是用来定义两个集合之间的匹配键,而不是直接写筛选条件。你现在的写法会把r => r.System_A_Name == "North America_A"的布尔结果当成Region的连接键,c => c.System_B_Name == "Canada"的布尔结果当成Country的连接键,这完全不符合你要关联Region和Country的业务逻辑,自然得不到正确的匹配记录。
针对你的需求(统计符合筛选条件的Region和Country匹配记录数),这里给你两种简单可行的实现方式:
方式一:利用实体类的导航属性(推荐)
因为你的Region和Country已经通过导航属性Countries/Regions建立了多对多关联,直接用导航属性展开关联集合再筛选计数会更直观:
// 统计符合条件的匹配记录数 var matchCount = repository.Regions // 先筛选出System_A_Name为"North America_A"的Region .Where(r => r.System_A_Name == "North America_A") // 展开每个Region关联的所有Country集合 .SelectMany(r => r.Countries) // 筛选出System_B_Name为"Canada"的Country .Where(c => c.System_B_Name == "Canada") // 最终计数 .Count();
如果matchCount > 0,就说明存在有效的匹配记录。
你也可以反向从Country出发查询,逻辑是一样的:
var matchCount = repository.Countries .Where(c => c.System_B_Name == "Canada") .SelectMany(c => c.Regions) .Where(r => r.System_A_Name == "North America_A") .Count();
方式二:手动使用Join关联(适合不依赖导航属性的场景)
如果因为某些原因不想用导航属性,需要手动指定连接逻辑,你可以基于多对多的关联键来写Join:
var matchCount = repository.Regions .Join( // 先筛选出目标Country repository.Countries.Where(c => c.System_B_Name == "Canada"), // Region的关联键 r => r.Id, // Country的关联键(从Country的Regions集合中取出关联的RegionId) c => c.Regions.Select(reg => reg.Id), // 定义连接后的结果(这里只需要计数,所以可以随便映射) (r, c) => 1 ) // 筛选出目标Region .Where(item => repository.Regions.Any(r => r.Id == item && r.System_A_Name == "North America_A")) .Count();
不过这种写法比用导航属性繁琐很多,所以更推荐第一种方式。
最后再提醒下:Count()方法会直接执行查询并返回匹配的记录数,非常适合用来判断是否存在有效记录——只要结果大于0,就说明有符合条件的匹配。
内容的提问来源于stack exchange,提问作者sm101
相关产品推荐
相关产品推荐

