MongoDb C# 驱动程序查询是否支持 Except()
本文关键字:Except 支持 是否 驱动程序 查询 MongoDb | 更新日期: 2023-09-27 18:30:58
var querycodes= new string[] {"aaa", "bbb", "ccc"};
var query = collection.AsQueryable<Source>()
.Where(d => (d.codes.Count == querycodes.Count() &&
!d.codes.Except(querycodes).Any()));
它抛出错误:
无法确定表达式的序列化信息:Enumerable.Count(Enumerable.Except(d.codes, String[]:{ "aaa", "bbb" ... }))。
如何实现查询目标?
可悲的是,官方驱动程序似乎目前不支持Except()
- 它不在这里的列表中
有一堆非标准扩展,如In
(映射到$in) - 您可能可以使用其中一个作为解决方法。(我看不到$nin
但是!In
可能会映射到$nin
?
作为最后的手段,您可能需要具体化集合的一部分,并使用 Linq to Objects 应用内存中的Except
?
编辑 这是将整个集合拉入内存的最后手段 - 如果有大量对象,则不建议这样做。
var querycodes= new string[] {"aaa", "bbb", "ccc"};
var query = collection.AsQueryable<Source>()
.ToList()
.Where(d => (d.codes.Count == querycodes.Count() &&
!d.codes.Except(querycodes).Any()));
或者更好的是,由于实现了Count()
(如$size
),因此在Mongo中进行第一次传递过滤器,然后在内存中进行第二次传递:
var querycodes= new string[] {"aaa", "bbb", "ccc"};
var query = collection.AsQueryable<Source>()
.Where(d => d.codes.Count == querycodes.Count())
.ToList()
.Where(d => !d.codes.Except(querycodes).Any()));