搜索功能查询linq

时间:2017-10-17 08:18:21

标签: c# linq

目前我正试图让搜索功能查询工作。我正在搜索一张名为" track"我的输入是一个搜索字段。 曲目表有:标题,艺术家和专辑。我能够搜索" michael jackson"作为艺术家或"击败它"会工作,但我不能让它工作"迈克尔杰克逊击败它"所以我低音希望它能同时搜索标题和艺术家。 我当前的查询

Db.From<Track>()
  .Where(q => q.Title.Contains(request.Trackname) || 
              q.Artist.Contains(request.Trackname) || 
              q.Album.Contains(request.Trackname))
  .Limit(20);

会提供一些帮助

2 个答案:

答案 0 :(得分:1)

您基本上需要拆分用户输入的搜索关键字的每个单词,然后单独搜索,

  1. 首先匹配确切的单词
  2. 然后是部分比赛
  3. 还需要使用Distinct来消除重复记录

    var searchStrings = request.TrackName.Split(' ').ToList();
    
    Db.From<Track>()
      .Where(q => 
                  request.TrackName.Equals(q.Album) ||
                  request.TrackName.Equals(q.Artist) ||
                  request.TrackName.Equals(q.Title) ||
                  request.TrackName.IndexOf(q.Album) > 0 ||
                  request.TrackName.IndexOf(q.Artist) > 0 ||
                  request.TrackName.IndexOf(q.Title) > 0 ||
                  searchStrings.Any(x => x.Equals(q.Title)) || 
                  searchStrings.Any(x => x.Equals(q.Artist)) || 
                  searchStrings.Any(x => x.Equals(q.Album)))
      .Distinct()
      .Limit(20);
    

答案 1 :(得分:1)

您可以通过这种方式获得最期望的结果,

拆分输入搜索,然后将其与标题,艺术家,专辑匹配。

        string search ="michael jackson beat it";

            var searchKeys = search.split(' ');

           Db.From<Track>()
            .Where(q => q.Title.Contains(request.Trackname) || 
              q.Artist.Contains(request.Trackname) || 
              q.Album.Contains(request.Trackname)) ||
              searchKeys.Contains(q.Album) ||
              searchKeys.Contains(q.Artist) ||
              searchKeys.Contains(q.Title) ||
              Array.Exists(searchKeys, z=> q.Title.Contains(z)) ||
              Array.Exists(searchKeys, z=> q.Artist.Contains(z)) ||
              Array.Exists(searchKeys, z=> q.Album.Contains(z))
  .Limit(20);

如果用户搜索如下所示,它将以任一方式为您提供结果:

  • 迈克尔杰克逊击败它
  • 击败迈克尔杰克逊