EF Core中ThenInclude调用自定义Where扩展方法报错问题
问题解决方法
核心原因
你遇到的错误是因为EF Core无法解析Include/ThenInclude中的自定义IEnumerable扩展方法——这类方法是针对内存集合的客户端操作,EF无法将其转换为SQL语句,而Include要求传入的必须是可被解析为属性访问或可翻译表达式的逻辑。
最优解决方案:改用IQueryable扩展方法
将你的过滤扩展方法改为针对IQueryable<T>的实现,让EF Core能解析其中的表达式树并转换为SQL:
public static IQueryable<T> WhereLanguageId<T>(this IQueryable<T> query, byte languageId) where T : ILanguageEntity { return query.Where(c => c.LanguageId.Equals(languageId)); }
修改后直接使用.ThenInclude(c => c.SettlementNames.WhereLanguageId(1))即可正常运行,EF会将过滤条件转换为SQL中的WHERE子句,在数据库层面完成过滤。
替代方案:使用投影手动赋值
如果无法修改扩展方法,可通过投影(Select)手动构造包含过滤后数据的对象,再赋值回原实体:
var events = await context.Events .Include(c => c.Location) .ThenInclude(c => c.Settlement) .Select(c => new { Event = c, FilteredSettlementNames = c.Location.Settlement.SettlementNames.WhereLanguageId(1).ToList() }) .ToListAsync() .Select(result => { result.Event.Location.Settlement.SettlementNames = result.FilteredSettlementNames; return result.Event; });
这种方法需要手动关联数据,不如第一种方案简洁,仅适合无法修改扩展方法的场景。
内容的提问来源于stack exchange,提问作者Jaczura Zoltán
相关产品推荐
相关产品推荐

