【问题标题】:Linq search with several keywords使用多个关键字进行 Linq 搜索
【发布时间】:2014-06-26 13:35:37
【问题描述】:

我已经搜索了很多关于这个问题的简单答案,但我失败了。我对 MVC 完全陌生,刚刚创建了一个小搜索引擎。它适用于 1 个关键字,但不超过 1 个关键字。

如果我搜索“俄亥俄钓鱼”,我想从数据库中获取所有使用这些关键字的用户。如何在几行中解决此问题?以下是我当前未修改的代码:

    public ActionResult Search(string Users)
    {
        var v = from p in db.UserProfiles
                where (p.UserName.Contains(Users)) ||
                      (p.About.Contains(Users)) ||
                      (p.City.Contains(Users))
                select p;

        return View("Find", v.ToList());
    }

【问题讨论】:

  • 澄清Users实际上是一个搜索词包含一个或多个词?
  • 是的,“用户”包含从视图发送的搜索关键字。

标签: c# asp.net-mvc linq search


【解决方案1】:

如果我没记错的话,那么我相信你想单独搜索这些词,即对于'Ohio fishing',你想搜索Ohio并单独钓鱼。在这种情况下,您需要在空白处拆分字符串,然后使用 contains 之类的:

public ActionResult Search(string Users)
{
    string[] terms = Users.Split();
    var v = from p in db.UserProfiles
            where (terms.Any(r=> p.UserName.Contains(r))) ||
                  (terms.Any(r => p.About.Contains(r))) ||
                  (terms.Any(r => p.City.Contains(r)))
            select p;

    return View("Find", v.ToList());
}

您还应该寻找Full-Text search feature on SQL Server

【讨论】:

  • 这将语义从“City contains {term}”更改为“City equals {term}, for a {terms}”(强调等于)
  • @MarcGravell,哦,是的,Marc,只是要更改为 Any with Contains。
  • 感谢您的回复。我在这里尝试了几个答案,总是得到相同的错误:LINQ To SQL 异常:本地序列不能用于查询运算符的 LINQ to SQL 实现中,除了包含运算符。
  • 当我添加 "AsEnumerable()" ... db.UserProfiles.AsEnumerable() 时,Habib 的答案有效。但是,现在它区分大小写,希望我能解决这个问题。谢谢哈比布。
  • 我理解 AsEnumerable() 在这种情况下的问题,但是,由于我的数据库可能永远不会包含超过几行,这是目前的解决方案。随着我知识的扩展,我稍后会升级一些和平。顺便说一句..感谢您提供有关“区分大小写”的信息,这也是一种魅力。谢谢!
【解决方案2】:

你可以试试这个:

public ActionResult Search(string[] Users)
{
    var v = from p in db.UserProfiles
            where (Users.Any(x=>p.UserName.Contains(x)) ||
                  (Users.Any(x=>p.About.Contains(x)) ||
                  (Users.Any(x=>p.City.Contains(x))
            select p;

    return View("Find", v.ToList());
}

现在它是如何工作的?举个例子:

Users.Any(x=>p.UserName.Contains(x))

这一项检查数组中是否至少有一项称为Users,其中该项包含在当前UserName 中。如果是这样,那么结果是正确的。否则为假。

【讨论】:

    【解决方案3】:

    我认为最简单的做法是使用PredicateBuilder 来构建动态查询。对于跨相对较小的数据库的小型查询,这将工作得相当好,但不能很好地扩展。更好的解决方案是使用全文搜索引擎(如 Lucene.NET)来索引您的数据并以更有效的方式执行搜索。

    public ActionResult Search(string[] Users)
    {
        var terms = Users.Split();
        var predicate = PredicateBuilder.False<User>90;
        foreach (var term in terms)
        {
             var temp = term; // avoid capture of loop variable
             predicate.Or(p => p.UserName.Contains(temp)
                                || p.About.Contains(temp)
                                || p.City.Contains(temp));
        }
    
        var v = db.UserProfiles.Where(predicate);
    
        return View("Find", v.ToList());
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-23
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多