2016-03-06 91 views
1

你好傢伙,這是我迄今爲止。EF獲得每個項目的記錄

public List<Word> GetWords(string[] words) 
{ 
     return DbContext.Words.Where(w => words.Contains(w.Value.ToLower()); 
} 

問題是,當我通過例如列表包含兩個相同的單詞我得到一個實體。什麼可以成爲獲得每個單詞實體的有效方式,即使它是重複的?

回答

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();    

} 
+0

我不認爲實體框架支持連接內存中的集合。 – Douglas

+0

不,我在加入之前將它轉換爲數組(在內存中)。 – Kaf

+0

我明白了。這將會運行,但如果表格很大,它將不會有效。 – Douglas

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();