2013-01-21 38 views
0

我有像這樣開始與一個數組

public List<Entry> GetEntriesForSlider(int first, int max, List<string> NameLetters) 
{ 
    //Some code 
} 

的功能在這個代碼,我想沿着一個數據庫中搜索,返回擁有開始與NameLetters內​​的字母名字每個結果。

所以,如果我通過在陣列中NameLetters = ["a","b","c"]

然後它會返回結果如

Amy 
Bert 
Aaron 
Chris 

應當指出的是,我非常希望使用某種形式的LINQ語句,如..

entries.Where(x => x.FirstName.StartsWith(partofArray)); 

如果可能的話。

編輯:我以前有以下幾點:

var entries = _repository.All<Entry>().Skip(first).Take(max); 
if (NameLetters != null && NameLetters.Count > 0) 
    entries = entries.Where(x => NameLetters.Contains(x.FirstName[0].ToString())); 

但我發現,它在運行where語句之前列舉的查詢(我認爲)。可能是因爲試圖訪問firstname(或ToString)的第一個字母。

+0

你的後端數據庫是什麼? – dasblinkenlight

+0

Microsoft SQL Server 2008 – MindingData

+0

您打算使用'EntityFramework'還是隻使用'SQL Connections'? –

回答

3

如果你只是尋找匹配的第一個字母嘗試:

entries.Where(x => partofArray.Contains(x.FirstName[0])); 

如果你需要擔心空或空字符串一個更安全的版本是:

entries.Where(x => 
        !string.IsNullOrEmpty(x.FirstName) && 
        partofArray.Contains(x.FirstName[0]) 
      ); 

如果你想使用可變長度的字符串嘗試:

entries.Where(x => 
        partofArray.Any(p=> x.FirstName.StartsWith(p)) 
      ); 
+0

有這個問題,會編輯問題。編輯,也是你的第二個似乎枚舉查詢以及我認爲:\ – MindingData

+0

當你說「枚舉查詢」你的意思是執行實際的SQL? –

+0

我的意思是它會首先獲取數據,然後在返回的數據集上運行Where語句,而不是將LIKE語句寫入數據庫。 – MindingData

0

也許你應該看看predicate builder

然後像

IQueryable<Entry> GetThingsThatBeginWithA(String[] prefixes) 
{ 
    var predicate = PredicateBuilder.False<Entry>(); 
    foreach (String prefix in prefixes) 
     predicate = predicate.Or(p => p.FirstName.StartsWith(prefix)); 
    return database.Entries.Where(predicate); 
} 

這個查詢應該正確編譯爲一個單一的查詢到SQL存儲。

更新:它也可以在沒有謂詞構建器的情況下完成,但我發現使用沒有它的表達式樹是非常乏味的。