Linq搜索了几个关键字

时间:2014-06-26 13:35:37

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

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

如果我搜索'Ohio fishing',我想让所有用户从数据库中获取这些关键字。我如何解决几行问题?以下是我目前未经修改的代码:

    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());
    }

3 个答案:

答案 0 :(得分:5)

如果我没有错,那么我相信你想单独搜索这些条款,即'Ohio fishing'你要搜索Ohio并单独钓鱼。在这种情况下,您需要将字符串拆分为空格,然后使用包含:

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

答案 1 :(得分:0)

你可以尝试这个:

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中。如果是这样,那么结果是真的。否则是假的。

答案 2 :(得分:0)

我认为最简单的方法是使用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());
}