使用EF Core查询Cosmos时如何通过子用户Email属性获取对应父Account对象
问题原因
你遇到的查询无法翻译问题,是旧版本 Entity Framework Core Cosmos 提供器对 OwnsMany 配置的内嵌集合的 Any() 操作翻译支持不足导致的。
解决方案
方案1:升级 EF Core 版本
EF Core 6.0 及更高版本的 Cosmos 提供器已经完善了内嵌集合查询的翻译支持,升级到对应版本后,你现有查询不需要做任何修改即可正常执行:
var account = await (from a in _context.Accounts where a.AccountUsers.Any(m => m.Email == email) select a).FirstOrDefaultAsync();
方案2:使用 Cosmos 原生 SQL 查询
如果暂时无法升级 EF Core 版本,可以通过 FromSqlRaw 方法直接执行 Cosmos 原生 SQL 语句实现查询:
var account = await _context.Accounts .FromSqlRaw(@"SELECT * FROM c WHERE EXISTS( SELECT 1 FROM u IN c.AccountUsers WHERE u.Email = {0} )", email) .FirstOrDefaultAsync();
注意事项
- 建议在 Cosmos 容器的索引策略中添加
/AccountUsers/[]/Email/?的索引配置,避免全表扫描,提升查询性能。 - 原生 SQL 查询的返回结构和 Account 实体属性完全匹配,EF Core 会自动完成实体映射,内嵌的 AccountUsers 集合也会正常填充。
内容的提问来源于stack exchange,提问作者coolblue2000
相关产品推荐
相关产品推荐

