Как вызвать хранимую функцию JavaScript, чтобы добавить поле к объектам, возвращаемым запросом, используя драйверы linq и c # - PullRequest
0 голосов
/ 10 мая 2018

У меня есть этот запрос:

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;
}

Я не знаю, как я могу сделать такой расчет, используя "агрегат". Буду признателен за любую помощь или любой другой подход, которому я мог бы следовать.

...