将来自多个查询的结果合并为单个可查询

时间:2013-04-16 10:37:47

标签: c# .net entity-framework linq-to-entities

我想搜索用户数据库,并根据匹配的精确程度订购我的结果。作为示例,在单个词匹配之前,用户名上的完全匹配应出现在结果中。

这就是我所拥有的(变量'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的结果组合在一起并有一个新的可查询,我可以传递。我也想保留我的查询顺序,坦率地说我不知道​​如何去做这个...

2 个答案:

答案 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);