我想搜索用户数据库,并根据匹配的精确程度订购我的结果。作为示例,在单个词匹配之前,用户名上的完全匹配应出现在结果中。
这就是我所拥有的(变量'value'包含搜索词,'query'包含我想要修改的初始可查询词)
var values = value.Split(new [] {' ','\t', '\n', '\r'});
var q1 = query.Where(u => u.Id == valueAsInt || u.ExternalId == valueAsInt);
var q2 = query.Where(u => u.Name.Contains(value) || u.Username.Contains(value));
var q3 = query.Where(u => values.All(i => u.Name.Contains(i)) || values.All(i => u.Username.Contains(i)));
var q4 = query.Where(u => values.Any(i => u.Name.Contains(i)) || values.Any(i => u.Username.Contains(i)));
但是,我现在想要将q1到q4的结果组合在一起并有一个新的可查询,我可以传递。我也想保留我的查询顺序,坦率地说我不知道如何去做这个...
答案 0 :(得分:0)
Silas Hansen在评论中回答
答案 1 :(得分:0)
你应该使用排名。 e.g。
var result = query.Select(u =>
{
if (u.Id == valueAsInt || u.ExternalId == valueAsInt)
return new {Rank = 1, Item = u};
if (u.Name.Contains(value) || u.UserName.Contains(value) )
return new {Rank = 2, Item = u};
//Add the other conditions in here
return new {Rank = 3, Item = u};
}).OrderBy(u => u.Rank).Select(u => u.Item);