我有一个用户表和一个到多个UserSkills表。我需要能够根据技能搜索用户。该查询获取所需技能的列表并搜索具有这些技能的用户。我想根据他们拥有的期望技能的数量对用户进行排序。所以如果一个用户只有3个所需技能中的1个,他将比具有3个所需技能3个的用户更低。有没有更好的方式来编写这个frankenstein LINQ查询,它在子表中搜索值并按相关性对它们进行排序?
我开始与我的逗号分隔正在搜索技能ID列表:
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;
这个工程!但对我来说,它似乎超级臃肿和低效。特别是计算所发现技能数量的次要部分。
感谢您的任何建议,你可以给。
--R
谢谢。查询更改工作。 re:IQueryable。我将我的第一个查询更改为IQueryable,但后来我得到本地序列不能用于LINQ to SQL实现错误,当我尝试DataBind第二个查询的结果时。 – MRV 2010-03-12 07:19:22
re:UserSkills表的显式连接,我在嵌套的DataBind中使用它。 – MRV 2010-03-12 07:22:00
只需调用ToList(),以便数据绑定列表......这是否工作? – 2010-03-17 18:00:31