使用LINQ/.NET MVC排名搜索结果



我有一个任务,我需要根据找到搜索词的列表对搜索结果进行排名。

因此,例如,如果在表1的A列中找到搜索词,则比在表2的A列中找到它的排名更高。

现在,我有一个LINQ查询,可以连接多个表,并在某些列中搜索搜索词。即。

var results = db.People
    .Join(db.Menu, p => p.ID, m => m.PersonID, (p, m) => new { p = p, m = m })
    .Join(db.Domain, m => m.m.DomainID, d => d.ID, (m, d) => new { m = m, d = d })
    .Where(d => searchTermArray.Any(x => d.m.p.p.Name.Contains(x)) || searchTermArray.Any(x => d.m.p.p.Biography.Contains(x)) || searchTermArray.Any(x => d.d.domain.Contains(x)))
    .Select(p => p).Distinct();

因此,如果在db.people中找到搜索词,该行/人的排名将比在db.people中发现的排名高,列列传记,其排名将比在db.domain,列域域中更高。。

这将通过"等级"订购您的结果。如果您还想返回排名,则可以进一步操纵查询,而不仅仅是汇总:

var results = db.People
    .Join(db.Menu, p => p.ID, m => m.PersonID, (p, m) => new { p = p, m = m })
    .Join(db.Domain, m => m.m.DomainID, d => d.ID, (m, d) => new { m = m, d = d })
    .Select(d => new
            {
                rank = searchTermArray.Any(x => d.m.p.p.Name.Contains(x)) ? 3 : searchTermArray.Any(x => d.m.p.p.Biography.Contains(x)) ? 2 : searchTermArray.Any(x => d.d.domain.Contains(x)) ? 1 : 0,
                m = d
            })
    .Where(a => a.rank > 0)
    .OrderByDescending(a => a.rank)
    .Select(a => a.m).Distinct();

注意:我对表现不佳的责任不承担任何责任,毕竟是Linq。