You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:24:04