У меня возникли проблемы с запросом базы данных MongoDB с использованием динамического генерации предиката.MongoDB with C# - запрос с динамически сгенерированным предикатом
документ structue я пытаюсь запросить на это:
{
"_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 to Mongo генерировать запрос из такого выражения или нет (я думаю, он должен).
Так что я просто пытаюсь сделать что-то, что драйвер C# Mongo не поддерживает, или я не создаю предикат? Я видел от another question, что то, что я пытаюсь сделать, должно быть возможно (теоретически, по крайней мере).
Я использую официальный драйвер 10gen версии 1.8.3
вы можете попробовать .Tolist() независимо от .AsQueryable() –
@ RaphaëlAlthaus Я совсем забыл про AsExpandable (!) И это решило проблему. Если вы добавите это как ответ, я соглашусь с ним. – Anduril