[英]Dynamic Linq Predicate throws “Unsupported Filter” error with C# MongoDB Driver
[英]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']
过滤我的 collections 。
我们定义,如果我有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)
我该怎么做才能使这种过滤成为可能? 谢谢你。
这可以返回两个匹配的文档:
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>();
你不能对司机这样做。 它不翻译StartsWith
。 它只适用于简单的平等检查。 这是获得所需结果的方法。 您需要将输入转换为前缀正则表达式数组。 不幸的是,没有强类型的方法来做到这一点。
var userEntryPoints = "[/^ROOT/,/^SPECIAL/]";
FilterDefinition<Content> filter = $"{{ EntryPoint : {{ $in : {userEntryPoints} }} }}";
var result = await (await collection.FindAsync(filter)).ToListAsync();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.