你好傢伙,這是我迄今爲止。EF獲得每個項目的記錄
public List<Word> GetWords(string[] words)
{
return DbContext.Words.Where(w => words.Contains(w.Value.ToLower());
}
問題是,當我通過例如列表包含兩個相同的單詞我得到一個實體。什麼可以成爲獲得每個單詞實體的有效方式,即使它是重複的?
你好傢伙,這是我迄今爲止。EF獲得每個項目的記錄
public List<Word> GetWords(string[] words)
{
return DbContext.Words.Where(w => words.Contains(w.Value.ToLower());
}
問題是,當我通過例如列表包含兩個相同的單詞我得到一個實體。什麼可以成爲獲得每個單詞實體的有效方式,即使它是重複的?
不確定是否需要子字符串或相等字,以下查詢返回多個記錄但檢查同一個字不是子字符串。
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();
}
鑑於這種簡單的測試案例,其中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();
我不認爲實體框架支持連接內存中的集合。 – Douglas
不,我在加入之前將它轉換爲數組(在內存中)。 – Kaf
我明白了。這將會運行,但如果表格很大,它將不會有效。 – Douglas