C# 具有多个关键字的Linq搜索

C# 具有多个关键字的Linq搜索,c#,asp.net-mvc,linq,search,C#,Asp.net Mvc,Linq,Search,我已经为这个问题寻找了很多简单的答案,但我失败了。我是MVC的新手,刚刚创建了一个小搜索引擎。使用1个关键字时效果很好,但不能超过1个关键字 如果我搜索“Ohio fishing”,我想从数据库中获取所有具有这些关键字的用户。我如何在几行中解决这个问题?以下是我当前未修改的代码: public ActionResult Search(string Users) { var v = from p in db.UserProfiles

我已经为这个问题寻找了很多简单的答案,但我失败了。我是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());
    }

如果我没有错的话,那么我相信您希望分别搜索这些术语,即对于
俄亥俄州钓鱼
您希望分别搜索
俄亥俄州
和钓鱼。在这种情况下,您需要在空白处拆分字符串,然后使用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());
}

您还应该查找

您可以尝试以下方法:

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
的项,其中该项包含在当前
用户名中。如果是这样,那么结果是真的。否则是错误的。

我认为最简单的方法是使用。这对于一个相对较小的数据库中的小查询相当有效,但扩展性不太好。更好的解决方案是使用全文搜索引擎,比如索引数据,并以更高效的方式执行搜索

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());
}
公共操作结果搜索(字符串[]用户)
{
var terms=Users.Split();
var谓词=PredicateBuilder.False90;
foreach(var术语)
{
var temp=term;//避免捕获循环变量
谓词.Or(p=>p.UserName.Contains(temp)
||p.About.容器(温度)
||p.City.Contains(temp));
}
var v=db.UserProfiles.Where(谓词);
返回视图(“Find”,v.ToList());
}

为了澄清
用户
实际上是一个包含一个或多个单词的搜索词吗?是的,'Users'包含从视图发送的搜索关键字。这将语义从“City contains{term}”更改为“City equals{term},对于其中一个{terms}”(强调相等)@marcgravel,哦,是的,Marc,只是要更改为任何包含。感谢您的回复。我在这里尝试了一些答案,但总是得到相同的错误:LINQ到SQL异常:除了Contains运算符之外,查询运算符的LINQ到SQL实现中不能使用局部序列。当我添加“AsEnumerable()”时,Habib的答案起了作用。。。但是,现在它区分大小写,希望我能解决这个问题。谢谢Habib。我理解在这种情况下AsEnumerable()的问题,但是,因为我的数据库可能永远不会包含超过几行的内容,所以这是目前的解决方案。随着我知识的扩展,我将在稍后升级一些和平。顺便说一句谢谢你提供的关于“区分大小写”的信息,这也是一种魅力。非常感谢。