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

如何实现查询目标?

4

1 回答 1

0

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

有一堆非标准扩展,例如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()被实现(as $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()));
于 2013-09-12T06:22:05.713 回答