首页 > 解决方案 > Mongodb C# Driver Unsupported filter error with specific linq predicate

问题描述

我有一个 IMongoCollection 内容:

collection = [
{Value = 'x', EntryPoint= 'ROOT/1' }, 
{Value = 'y', EntryPoint= 'ROOT/2' }, 
{Value = 'z', EntryPoint= 'OTHER/1' }]

现在我想用​过滤我的收藏 userEntryPoints = ['ROOT', 'SPECIAL']

我们定义了,如果我有entrypoint = 'ROOT',我们也有入口点是等价的'ROOT/1', 'ROOT2'

所以预期的结果是

result = [
{Value = 'x', EntryPoint= 'ROOT/1' }, 
{Value = 'y', EntryPoint= 'ROOT/2' }]

我正在使用的代码是

var collection = mongoDatabase.GetCollection(Data);
return collection.AsQueryable().Select(xxx)
.Where(item => userEntryPoints.Any( entrypoint => item.EntryPoint.StartsWith(entrypoint)))

如果collection并且userEntryPoints是简单数组,这应该可以工作。

但是在我的代码中,在运行时我有一个 mongodb 错误:

Unsupported filter: Any(value(System.Collections.Generic.List`1[System.String]].Where({document}{EntryPoint}.StarsWith(document))))

At MongoDB.Driver.Linq.Traslators.PredicateTranslator.Translate(Expression node)

我该怎么做才能使这种过滤成为可能?谢谢你。

标签: c#mongodblinq

解决方案


这可以返回两个匹配的文档:

Regex regex = new Regex("^ROOT|^SPECIAL");
var qry = collection.AsQueryable()
                    .Where<CollectonClass>(e => regex.IsMatch(e.EntryPoint))
                    .Select(e => new { e.Value, e.EntryPoint } );

var docList = qry.ToList();
docList.ForEach(e => Console.WriteLine(e.ToJson()));

变体:

var rgxList = new string [] { "^ROOT", "^SPECIAL" };
var rgx = new Regex(string.Join("|", rgxList));
var filter = Builders<BsonDocument>.Filter.Regex("EntryPoint", rgx);
var list = collection.Find(filter).ToList<BsonDocument>();

推荐阅读