使用c#进行多个关键字数据库搜索(linq to sql)

时间:2013-06-12 21:59:50

标签: c# linq linq-to-sql

我正在尝试构建一个接受多个关键字的搜索(空格分隔或逗号,这不是问题)。 我目前有这个

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。

由于

3 个答案:

答案 0 :(得分:3)

试试这个,我使用并行来加速搜索。我正在检查字符串[]匹配中传递的任何键的一系列字符串。在我的例子中,我正在搜索“test”和“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必须是您正在执行的搜索键的字符串,并在空格之间进行分割以获取所有匹配项。

答案 1 :(得分:0)

如果你对关键字要求完全匹配没问题,那么这将有效:

var allCriteria = criteria.Split(',');

db.Posts.Where(p => allCriteria.Contains(p.PostText) || allCriteria.Contains(p.Weather)  || allCriteria.Contains(p.Location)

答案 2 :(得分:-2)

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