如何扩展LINQ查询,过滤对象中的数组仅返回匹配的子对象
解决方案
针对EF Core 5+版本(推荐)
直接用EF Core支持的过滤Include功能,在关联查询子对象时加过滤条件,数据库层面只会返回符合要求的子对象,同时保留ParentObject的所有原有字段,不用手动构造新对象:
myQueryable = myQueryable // 先筛选出包含匹配子对象的ParentObject .Where(mq => mq.OtherObjects.Any(oo => oo.PropA.Equals(filterParams.PropA))) // 只加载符合PropA条件的OtherObject子集合 .Include(mq => mq.OtherObjects.Where(oo => oo.PropA.Equals(filterParams.PropA)));
这个写法会让EF生成的SQL自动关联过滤后的子对象数据,返回的ParentObject实例里,OtherObjects集合仅包含PropA匹配搜索参数的子项,完全满足需求,而且全程在数据库层面完成过滤,不会拉取多余数据。
针对旧版本EF(如EF6)
旧版本EF不支持过滤Include,这种情况下如果必须从数据库直接获取过滤后的子集合,只能通过投影查询(但你不想手动新建对象,这个方案实用性不高),或者只能退而求其次用你原本的本地过滤方式。
内容的提问来源于stack exchange,提问作者bertenvdb
相关产品推荐
相关产品推荐

