【问题标题】:Sorting collection based on keywords with Linq使用 Linq 根据关键字对集合进行排序
【发布时间】: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,在此之前搜索还有进一步的查询。

标签: linq sorting


【解决方案1】:

我相信您应该能够在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);

【讨论】:

  • 这并不能解决我的查询,条件语句应该是什么!?
  • @Dez79 你看到我提供的代码中的条件语句了吗?这段代码有什么问题?你试过了吗?
猜你喜欢
  • 2010-11-03
  • 1970-01-01
  • 2011-04-21
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 2015-12-12
相关资源
最近更新 更多