J'ai un tableau d'utilisateurs et un tableau de compétences d'un à plusieurs utilisateurs. J'ai besoin de pouvoir rechercher des utilisateurs sur la base de leurs compétences. Cette requête prend une liste de compétences souhaitées et recherche les utilisateurs qui ont ces compétences. Je souhaite trier les utilisateurs en fonction du nombre de compétences souhaitées qu'ils possèdent. Ainsi, si un utilisateur ne possède que 1 des 3 compétences souhaitées, il sera plus loin dans la liste que l'utilisateur qui possède 3 des 3 compétences souhaitées.
Je commence par une liste séparée par des virgules des identifiants de compétences recherchés :
List<short> searchedSkillsRaw = skills.Value.Split(',').Select(i => short.Parse(i)).ToList();
Je filtre ensuite uniquement les types d'utilisateurs qui peuvent faire l'objet d'une recherche :
List<User> users = (from u in db.Users
where
u.Verified == true &&
u.Level > 0 &&
u.Type == 1 &&
(u.UserDetail.City == city.SelectedValue || u.UserDetail.City == null)
select u).ToList();
puis vient la partie la plus folle :
var fUsers = from u in users
select new
{
u.Id,
u.FirstName,
u.LastName,
u.UserName,
UserPhone = u.UserDetail.Phone,
UserSkills = (from uskills in u.UserSkills
join skillsJoin in configSkills on uskills.SkillId equals skillsJoin.ValueIdInt into tempSkills
from skillsJoin in tempSkills.DefaultIfEmpty()
where uskills.UserId == u.Id
select new
{
SkillId = uskills.SkillId,
SkillName = skillsJoin.Name,
SkillNameFound = searchedSkillsRaw.Contains(uskills.SkillId)
}),
UserSkillsFound = (from uskills in u.UserSkills
where uskills.UserId == u.Id && searchedSkillsRaw.Contains(uskills.SkillId)
select uskills.UserId).Count()
} into userResults
where userResults.UserSkillsFound > 0
orderby userResults.UserSkillsFound descending
select userResults;
et ça marche ! Mais cela me semble très lourd et inefficace. Surtout la partie secondaire qui compte le nombre de compétences trouvées.
Merci pour tous les conseils que vous pourrez me donner.
--r