У меня есть таблица Users и таблица UserSkills один ко многим. Мне нужно иметь возможность искать пользователей на основе навыков. Этот запрос берет список желаемых навыков и ищет пользователей, которые имеют эти навыки. Я хочу отсортировать пользователей по количеству желаемых навыков, которыми они обладают. Таким образом, если у пользователя есть только 1 из 3 желаемых навыков, он будет дальше в списке, чем пользователь, имеющий 3 из 3 желаемых навыков.
Я начинаю с моего списка идентификаторов умений, разделенных запятыми, которые ищутся:
List<short> searchedSkillsRaw = skills.Value.Split(',').Select(i => short.Parse(i)).ToList();
Затем я отфильтрую только тех пользователей, которые доступны для поиска:
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();
и затем приходит сумасшедшая часть:
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;
и это работает! Но это кажется супер раздутым и неэффективным для меня. Особенно вторичная часть, которая подсчитывает количество найденных умений.
Спасибо за любой совет, который вы можете дать.
- г * * 1016