如何使用Entity Framework LINQ统计CSV关联的子表项所属包数量
实现方案
你只需要在Count的条件里做CSV格式的精确匹配即可,避免ID部分匹配的问题,代码如下:
using(var db = new DBContext()) { var output = (from s in db.Services select new { s.ID, s.ServiceName, Packages = $"({db.Packages.Count(p => ("," + p.Services + ",").Contains("," + s.ID.ToString() + ","))}) Packages" }).ToList(); }
逻辑说明
- 我们把Package的
Services字段前后都拼接上逗号,同时把当前Service的ID也前后拼接逗号,再判断包含关系,比如ID为1的服务会匹配,1,,不会误匹配到ID为11、21这类包含数字1的ID - 该写法在EF Core 3.0+版本中可以直接被翻译成原生SQL执行,不需要把全表数据加载到内存计算,性能可控
优化建议
如果业务允许的话更建议调整表结构,新增PackageServiceRel中间表存储两者的多对多关联关系,替代CSV存储关联ID的方案,既符合数据库设计范式,也能大幅提升关联查询的性能,尤其是数据量较大的时候优势更明显。
内容的提问来源于stack exchange,提问作者sridharnetha
相关产品推荐
相关产品推荐

