我有一个任务,我需要根据找到搜索词的列表对搜索结果进行排名。
因此,例如,如果在表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。