我已经创建了一个应用程序,供用户在组织中搜索。
public class Organisation
{
public string OrgName { get; set; }
public string ContactName { get; set; }
public string OverviewOfServices { get; set; }
public string Address1 { get; set; }
public string Town { get; set; }
public string PostCode { get; set; }
public string Keywords { get; set; }
}
用户可以输入多个关键字。我将关键字分成一个数组:
string[] searchTerms = keywordphrase.Split(new[] { ' ' },StringSplitOptions.RemoveEmptyEntries);
并按以下方式搜索模型:
orglist = _UoW.OrganisationRepo.All();
orglist = (from org in orglist
where searchTerms
.All(s => org.OrgName.ToLower().Contains(s.ToLower()) ||
org.OverviewOfServices.ToLower().Contains(s.ToLower()) ||
org.ContactName.ToLower().Contains(s.ToLower()) ||
org.Address1.ToLower().Contains(s.ToLower()) ||
org.Town.ToLower().Contains(s.ToLower()) ||
org.PostCode.ToLower().Contains(s.ToLower()) ||
org.Keywords.ToLower().Contains(s.ToLower()))
select org);
我现在有了那些在任何指定字段中包含关键字的组织的列表。
我想对结果进行排序,以便首先(根据相关性)在OrgName中列出具有关键字的任何/所有组织,然后是在OrgName中未列出关键字的组织。
以下列出了基于indexof的组织,并且仅当我使用关键字短语(而不是每个关键字)时:
orglist = orglist.OrderBy(m => m.OrgName.StartsWith(keywordphrase))
但这不是很合适。
是否可以对它们进行排序,以便包含输入关键字的组织首先出现在结果集合中,然后是其余记录,即关键字不在OrgName中。
答案 0 :(得分:0)
我相信您应该能够在orderby
短语中使用条件语句来控制排序:
orglist = (from org in orglist
where searchTerms
.All(s => org.OrgName.ToLower().Contains(s.ToLower()) ||
org.OverviewOfServices.ToLower().Contains(s.ToLower()) ||
org.ContactName.ToLower().Contains(s.ToLower()) ||
org.Address1.ToLower().Contains(s.ToLower()) ||
org.Town.ToLower().Contains(s.ToLower()) ||
org.PostCode.ToLower().Contains(s.ToLower()) ||
org.Keywords.ToLower().Contains(s.ToLower()))
orderby searchTerms.Any(s => org.OrgName.Contains(s)) ? 1 : 2
select org);