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" ... }))。

如何实现查询目标?

MongoDb C# 驱动程序查询是否支持 Except()

可悲的是,官方驱动程序似乎目前不支持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()));