使用c# (linq to sql)进行多关键字数据库搜索
本文关键字:关键字 数据库 搜索 linq to sql 使用 | 更新日期: 2023-09-27 18:18:01
我试图建立一个接受多个关键字的搜索(空格分隔或逗号,这不是问题)。我现在有这个
public IQueryable<Post> Search(string criteria, int x)
{
return
(_db.Posts.Where(p => p.IsActive &&
(p.PostText.Contains(criteria) || p.Weather.Contains(criteria) || p.Location.Contains(criteria))
).OrderByDescending(p => p.PostDate)).Take(x);
}
,但只返回精确匹配。如何搜索每个关键字并返回x个结果?顺便说一下,它应该是一个OR。
谢谢
试试这个,我正在使用并行来加速搜索。我正在检查一系列字符串,在字符串[]匹配中传递的任何键。在我的例子中,我搜索"test"answers"1",你会看到3个结果。
static void Main(string[] args)
{
List<string> list = new List<string>();
list.Add("b lue number 1");
list.Add("test number 234");
list.Add("yello number 2334");
list.Add("yes whippea number 324234");
list.Add("test number asdf");
var results = Program.Search(list,"test","1");
Console.ReadLine();
}
为了遵循您的示例,您可以这样做。
public List<Post> Search(string criteria, int x)
{
// Split all the search keys by space, so if you have "Search Word", you will get
// the occurances of [Search] and also [Word]
List<string> searchKeys = criteria.Split(' ').ToList<string>();
// Filter active
_db = _db.Where(p => p.IsActive);
// Go through each key
foreach (string str in searchKeys)
{
_db = _db.Where(p => p.Location.Contains(str)
|| p.PostText.Contains(str)
|| p.Weather.Contains(str));
}
// Return number wanted - and items will only be extracted here on the ToList()
return _db.OrderByDescending(p => p.PostDate).Take(x).ToList();
}
我正在循环条件并逐个添加条件。Criteria必须是您正在执行的搜索关键字的字符串,并在空格之间分割以获得所有出现的
如果你对需要精确匹配的关键字没有意见,那么这就可以了:
var allCriteria = criteria.Split(',');
db.Posts.Where(p => allCriteria.Contains(p.PostText) || allCriteria.Contains(p.Weather) || allCriteria.Contains(p.Location)
public IQueryable<Post> Search(string criteria, int x)
{
var allCriteria = criteria.Split(',');
var result=db.Posts.Where(p =>
allCriteria.Any(c=>p.PostText.Contains(c))
|| allCriteria.Any(c=>p.Weather.Contains(c))
|| allCriteria.Any(c=>p.Location.Contains(c))
).Where(p=>p.IsActive)
.OrderByDescending(p => p.PostDate)
.Take(x);
return result;
}