C# 在数据库中搜索字符串中的单词

C# 在数据库中搜索字符串中的单词,c#,linq,C#,Linq,假设用户输入了一个句子,我需要搜索由输入句子中的单词组成的主题。这些是我认为他们可以解决这个案子的代码 var result = from x in dataBase.tableName select x; string[] words = enteredString.Split(); foreach(string word in words) { result = result.Where(x =>

假设用户输入了一个句子,我需要搜索由输入句子中的单词组成的主题。这些是我认为他们可以解决这个案子的代码

var result = from x in dataBase.tableName 
             select x;

string[] words = enteredString.Split(); 

foreach(string word in words) 
            {
                result = result.Where(x => x.subject.Contains(word));
            }
它只显示句子中最后一个单词的搜索结果,但我认为每次在where行中使用一个单词时,结果都必须缩小

试试这个:

foreach(string word in words) 
{
  var temp = word;
  result = result.Where(x => x.subject.Contains(temp));
}

这是由ReSharper调用的,至少可以访问修改后的闭包-lambda表达式不捕获值,而是捕获整个变量。变量字的值随着循环的每次迭代而变化。因此,由于Where方法是惰性计算的,因此在使用该序列时,word的值是序列中的最后一个值。

它不能做这件事-因为每个单词都覆盖了以前的结果-您需要执行类似的操作:

List<object> AllResults = new List<object>();

foreach(string word in words) 
{
  var temp = word;
  AllResults.AddRange (result.Where(x => x.subject.Contains(temp)).ToList());
}

不确定您的结果类型是什么类型,因此列表…

我通过颠倒如下逻辑获得了一些成功:

string[] words = enteredString.Split();

var results = from x in database.TableName
              where words.Any(w => x.subject.Contains(w))
              select x;
-编辑 对于此类查询,更通用的方法是:

class SearchQuery
{
    public ICollection<string> Include { get; private set; }
    public ICollection<string> Exclude { get; private set; }
}

[...]
SearchQuery query = new SearchQuery
{
    Include = { "Foo" }, Exclude = { "Bar" }
}

var results = from x in database.Table
              where query.Include.All(i => x.Subject.Contains(i)) &&
                    query.Exclude.All(i => !x.Subject.Contains(i))
              select x;
这假设query.Include中的所有单词都必须出现在Subject中,前提是要查找至少有一个单词query.Include.all的任何主题

我已经用EntityFramework4对此进行了测试。这将创建一个SQL查询,应用数据库中而不是内存中的所有条件。

给您:

var result = from x in dataBase.tableName 
             select x;

string[] words = enteredString.Split(); 
result.Where(r => words.Any(w => r.Subject.Contains(w));

你所付出的应该有用。。。您如何显示结果?您是否调试过它以查看多次调用Where?看起来它应该可以完成这项工作。您应该首先放置一个断点并单步执行代码。单词的内容是什么?您还可以输入database.Log=Console.Out;并观察outputwindow以获得结果SQL查询。查询是您所期望的吗?当您在查询中构造where子句时,您是这样的。所以它只有效地过滤最后一项。你能告诉我在哪里可以看到你的代码的输出吗?@Daniel,menu Debug->Windows->OutputI我尝试了你的代码,但当输入多个单词时,它什么都不显示……这是因为结果设置为第一个单词的结果,随后的搜索只在前一个结果中搜索并覆盖它…thx Yahia,但是你有什么解决我问题的方法吗?我怎样才能缩小结果范围?@Yahia我不认为这是个问题。如果他只寻找subject包含集合中所有单词的实体,我认为这是目标,那么每次对结果的重新定义都应该进一步细化结果集,即首先得到标题中包含单词1的所有实体,然后是包含单词1和单词2的实体, etc@Paul:我不确定他是否想要一个出现任何或所有单词的结果…抱歉,Yahia,但我不需要在IEnumerable中获得结果,我不知道如何将您的解决方案的结果转换为IEnumerableok-然后抓取我的解决方案。。。如果您需要每个结果记录中的所有单词,请使用Paul Equis解决方案,因为他的解决方案就是这样做的…它正在工作,但您能告诉我如何单独使用您的代码吗,我的意思是,我怎样才能先得到结果,然后用你的解决方案缩小结果的范围呢?@Daniel我想如果你把单词改了。任何单词都改成单词。所有这些都可能起作用trick@Daniel你能提供更多的细节吗,关于你想做什么?我有大约500个案例,在我的应用程序的搜索部分,用户可以通过输入一些单词来查找案例。所有这些词都必须存在于已发现的案例中。但问题是,所有案例的结果都来自应用程序的其他部分,我只能缩小范围。您是否尝试使用单词。all代替单词。如Paul Equis所建议的任何?