大家好,这是我到目前为止所做的。
public List<Word> GetWords(string[] words)
{
return DbContext.Words.Where(w => words.Contains(w.Value.ToLower());
}
问题在于,当我传递包含两个相同单词的List时,我得到一个实体。什么可以成为获得每个单词的实体的有效方法,即使它是重复的?
答案 0 :(得分:2)
鉴于此简化测试用例,sourceData
代表您的DbContext.Words
:
var sourceData = new string[]
{
"a",
"b",
"c"
};
var wordsToFind = new string[]
{
"a",
"a"
};
一种愚蠢的方式是为每个请求的输入执行查询:
var foundWords = wordsToFind.Select(w =>
sourceData.Where(s => s.Contains(w.ToLower()))).ToList();
或者您可以执行一次查询,然后通过再次在内存中执行查询来复制每个输入的结果:
var foundWords = sourceData.Where(w =>
wordsToFind.Contains(w.ToLower())).ToList();
var result = wordsToFind.SelectMany(w =>
foundWords.Where(f =>
f.Contains(w.ToLower()))).ToList();
答案 1 :(得分:1)
不确定您是否需要子字符串或相等的单词,在查询后返回多个记录但检查相同的单词而不是子字符串。
public List<Word> GetWords(string[] words)
{
var results = from word in DbContext.Words.ToArray()
join str in words on word.ToLower() equals str
select word;
return results.ToList();
}
编辑:首先从数据库中获取已过滤的记录,然后再次将其与数组连接以获取多条记录。同样检查两次。存储过程对于大型集合来说会更有效。
public List<Word> GetWords(string[] words)
{
var results = from word in DbContext.Words
.Where(w => words.Contains(w.Value.ToLower())
.ToArray()
join str in words on str.Contains(word.ToLower())
equals true
select word;
return results.ToList();
}