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