【发布时间】:2019-01-07 17:06:54
【问题描述】:
我创建了一个应用程序,用户可以通过组织进行搜索。
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 中的位置。
【问题讨论】:
-
您需要在列表中使用
Where(m => m.OrgName.StartsWith(keywordphrase))来获取匹配的组织,然后使用Except获取不匹配的组织,并将结果连接起来。但是,你真的应该为这样的事情使用数据库。 -
你会将哪个字段称为“标题”?
-
@NetMage 抱歉标题是 OrgName,我更新了我的问题
-
orglist的类型或OrganisationRepo.All的签名是什么?它是从哪里来的? -
OrganisationRepo.All 返回一个 IQueryable of Organisation,在此之前搜索还有进一步的查询。