У меня есть этот запрос:
var professionalProfilesQuery =
(from profileCollection in _mongoContext.Database.GetCollection<Profile>("profiles").AsQueryable()
join userCollection in _mongoContext.Database.GetCollection<User>("users").AsQueryable()
on profileCollection.UserId equals userCollection.Id.Value
into users
orderby profileCollection.Name
select new ProfessionalProfile
{
Id = profileCollection.Id,
Name = profileCollection.Name,
UserId = profileCollection.UserId,
IsConfirmed = users.First().IsConfirmed,
})
.Where(p => p.IsConfirmed);
И затем у меня есть сохраненная функция javascript в БД, которая вычисляет «Балл» для каждого ProfessionalProfile
по данным из нескольких коллекций (мне нужно отсортировать результаты позже по этому баллу). Что-то вроде:
function candidateScore(objectWithDataToCalculateScore, professionalProfile) {
var score = 0;
//Calculate score here
return score;
}
Можно ли добавить поле к данным, возвращаемым запросом с вычисленным счетом? Как я могу вызвать сохраненную функцию JavaScript для этого? Я хотел бы сделать что-то вроде:
var professionalProfilesQuery =
(from profileCollection in _mongoContext.Database.GetCollection<Profile>("profiles").AsQueryable()
join userCollection in _mongoContext.Database.GetCollection<User>("users").AsQueryable()
on profileCollection.UserId equals userCollection.Id.Value
into users
orderby profileCollection.Name
select new ProfessionalProfile
{
Id = profileCollection.Id,
Name = profileCollection.Name,
UserId = profileCollection.UserId,
IsConfirmed = users.First().IsConfirmed,
Score = ***CallToCandidateScoreFunctionHere...***
})
.Where(p => p.IsConfirmed);
Если это невозможно или это не очень хороший способ, предложите ли вы другой подход вместо хранимой функции javascript?
Спасибо.
РЕДАКТИРОВАТЬ: После прочтения комментариев Нила Ланна, я объясню лучше вычисление мне нужно.
Это пример класса, который моделирует коллекцию, которая будет первым параметром в предыдущей candidateScore
функции JavaScript:
public class ProfessionalProfileRequirements
{
[BsonId]
[BsonRepresentation(BsonType.String)]
public Guid Id { get; set; }
public string Role { get; set; }
public string Province { get; set; }
public IEnumerable<string> LanguagesRequired { get; set; }
public IEnumerable<string> SkillsRequired { get; set; }
}
И снова эта функция javascript с некоторыми вычислениями (она довольно сложная, поэтому я упростила ее. Надеюсь, этого достаточно, чтобы показать, что мне нужно):
function candidateScore(professionalProfileRequirements, professionalProfile) {
var score = 0;
if (professionalProfileRequirements.Province === professionalProfile.Province) {
score += 1000;
}
if (professionalProfileRequirements.Role && professionalProfile.Roles && professionalProfile.ExperienceLevel){
if (professionalProfile.Roles.includes(professionalProfileRequirements.Role)) {
switch (professionalProfile.ExperienceLevel) {
case 'ExperienceLevel_NoExperience':
score += 1;
break;
case 'ExperienceLevel_LessThanOneYear':
score += 2;
break;
case 'ExperienceLevel_BetweenOneAndThreeYears':
score += 4;
break;
case 'ExperienceLevel_BetweenThreeAndFiveYears':
score += 6;
break;
case 'ExperienceLevel_MoreThan5Years':
score += 10;
break;
}
}
}
return score;
}
Я не знаю, как я могу сделать такой расчет, используя "агрегат". Буду признателен за любую помощь или любой другой подход, которому я мог бы следовать.