我使用动态生成的谓词在查询mongoDB数据库时遇到困难。
我试图查询的文档结构是:
{
"_id" : 3121 ,
"Active" : true ,
"CategoryId" : 1 ,
"Crci" : "IH" ,
"CultureId" : null ,
"DateUpdated" : {
"$date" : 1381916923120
} ,
"Description" : "National Careers Service: Actuary" ,
"Keywords" : "" ,
"MaxLevel" : null ,
"MinLevel" : null ,
"PhoneNumber" : " " ,
"Priority" : 1 ,
"Title" : "National Careers Service: Actuary" ,
"WebUrl" : "https://nationalcareersservice.direct.gov.uk/advice/planning/jobprofiles/Pages/actuary.aspx" ,
"CareerCultureExternalResources" : [
{
"CareerId" : 5 ,
"CultureId" : 1 ,
"DisplayOrder" : 1 ,
"ExternalResourceId" : 3121 ,
"Vgs" : null
}
] ,
"SubjectExternalResources" : [ ] ,
"LifestyleCategories" : null
}
我正在尝试使用在谓词处查询,该谓词生成了一个运行时,例如:
Expression<Func<ExternalResourceView, bool>> predicate = predicateBuilder.True<ExternalResourceView>();
if (request.CultureId != null && request.CareerId != null) {
predicate = predicate.And(er => er.CareerCultureExternalResources.Any(ccer => ccer.CareerId == request.CareerId.Value && ccer.CultureId == request.CultureId.Value));
}
else if (request.SubjectAreaId != null && request.SubjectLevel != null && request.CultureId != null)
{
predicate = predicate.And(er => er.SubjectExternalResources.Any(ser => ser.SubjectAreaId == request.CareerId && ser.CultureId == request.CultureId));
}
IEnumerable<ExternalResourceView> matchingExternalResources = _externalResourceLibrary.AsQueryable().Where(predicate)
当我尝试执行查询时,我会收到错误:" Unsupported where clause: <InvocationExpression>
。"
我找不到linq到mongo是否能够从这样的表达式产生查询(我认为应该这样)。
所以我只是想做C#Mongo驱动程序不支持的事情,还是我不生成谓词对?我从另一个问题中看到,我要做的事情应该是可能的(至少从理论上讲)。
我正在使用官方的10Gen驱动程序VER 1.8.3
不确定它是MongoDB的解决方案,但是您可以尝试使用来自linqkit的AsExpandable()
(由同一人与PredicateBuilder制作)。
linqkit(以及有关AsExpandable()
以及与PredicateBuilder
关系的更多信息)可以在此处找到
使用mongodb查询构建器,而不是两次翻译谓词:
using MongoDB.Driver.Builders;
List<IMongoQuery> queries = new List<IMongoQuery>();
if (request.CultureId != null && request.CareerId != null) {
queries.Add(
Query<Person>.ElemMatch<IDependent>(p => p.Dependents,
q => Query.And(
q.EQ(x => x.CareerId, request.CareerId),
q.EQ(x => x.CultureId, request.CultureId))));
}
// ... etc
// Final Query:
var query = Query.And(queries);
我更改了使用$elemMatch
的查询,因为我有同一数组元素上的careerId
和cultureId
的感觉。如果该假设是错误的,请相应地调整查询。