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

时间:2013-09-12 05:56:29

标签: c# linq mongodb

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

如何实现查询目标?

1 个答案:

答案 0 :(得分:0)

可悲的是,似乎官方驱动程序目前不支持Except() - 它不在列表中here

有一堆non-standard extensions like In (maps to $in) - 您可以使用其中一种作为解决方法。 (我看不到$nin!In可能会映射到$nin?)

作为最后的手段,您可能需要实现集合的一部分并将内存中的Except应用于Linq到对象?

编辑这是将整个集合拉入内存的最后手段 - 如果您有大量对象,则不建议这样做。

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()));