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”...}))。
如何实现查询目标?
答案 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()));