0

我想搜索用户数据库并根据匹配的精确程度对结果进行排序。例如,用户名的精确匹配应出现在单个单词匹配之前的结果中。

这就是我所拥有的(变量“值”包含一个搜索词,“查询”包含一个我想修改的初始可查询)

        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 的结果结合起来,并有一个可以传递的新可查询对象。我还想保留查询的顺序,坦率地说,我不知道该怎么做。

4

2 回答 2

0

你应该使用排名。例如

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);
于 2013-04-16T15:48:24.807 回答
0

由 Silas Hansen 在评论中回答

于 2013-04-16T11:27:39.650 回答