想象一下,用户输入了一个句子,我需要搜索由输入句子中的单词组成的主题。这些代码我认为他们可以解决这个问题。
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行中使用单词时,结果必须缩小。
答案 0 :(得分:5)
试试这个:
foreach(string word in words)
{
var temp = word;
result = result.Where(x => x.subject.Contains(temp));
}
这被称为(至少由ReSharper)“访问修改后的闭包” - lambda表达式不捕获值,它们捕获整个变量。并且变量word
的值随循环的每次迭代而变化。因此,由于Where()方法是惰性求值的,因此在使用此序列时,word
的值是序列中的最后一个。
答案 1 :(得分:2)
我通过颠倒这样的逻辑取得了一些成功:
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
应该是query.Include.Any
}的任何主题p>
我已经使用Entity Framework 4进行了测试。这将创建一个SQL查询,它应用数据库中的所有条件而不是内存。
答案 2 :(得分:1)
你走了:
var result = from x in dataBase.tableName
select x;
string[] words = enteredString.Split();
result.Where(r => words.Any(w => r.Subject.Contains(w));
答案 3 :(得分:0)
它不能做到这一点 - 因为你用覆盖前一个result
的每一个字 - 你需要做类似的事情:
List<object> AllResults = new List<object>();
foreach(string word in words)
{
var temp = word;
AllResults.AddRange (result.Where(x => x.subject.Contains(temp)).ToList());
}
不确定结果类型的类型是List<object>
...