.NET Core 6 Cosmos DB EF LINQ查询无法翻译问题求助
EF Core Cosmos DB 查询包含特定子对象的父实体解决方案
修正后的服务器端查询代码
var assets = _context.Assets .Where(asset => asset.Cards.Any(card => card.CardType == "dummy")) .ToList();
原查询问题说明
你之前使用的SelectMany嵌套查询逻辑,无法被EF Core Cosmos DB的查询提供器翻译为有效的Cosmos DB SQL语句,因此触发了无法翻译的异常。这种展开后回选父实体的逻辑不在EF Core Cosmos支持的翻译范围内。
修正方案优势
- 采用
Where+Any的写法会被直接翻译为Cosmos DB的EXISTS查询,完全在服务器端执行,不会拉取全量数据,彻底避免客户端评估带来的性能损耗。 - 该写法天然无需
Distinct,因为每个符合条件的Asset只会被匹配一次(只要包含至少一个CardType为dummy的Card),直接返回目标集合。
扩展:如需同时过滤子对象
如果需要返回Asset的同时,只保留其中符合条件的Card子对象,可以使用投影查询:
var assetsWithFilteredCards = _context.Assets .Where(asset => asset.Cards.Any(card => card.CardType == "dummy")) .Select(asset => new { Asset = asset, FilteredCards = asset.Cards.Where(card => card.CardType == "dummy") }) .ToList();
内容的提问来源于stack exchange,提问作者Djdev
相关产品推荐
相关产品推荐

