2015-07-12 89 views
0

寫的搜索查詢我需要根據以下標準來寫的搜索:如何使用或代替而

我要找到匹配 key1的OR鍵2 OR關鍵的3個值的值的所有記錄。 ..等

鍵和值的數量是可變的

List<KeyValuePair<string, string[]>> filterlist = new List<KeyValuePair<string, string[]>>() 
     { 
      new KeyValuePair<string, string[]>("Key1", new []{"jay","bloggs"}), 
      new KeyValuePair<string, string[]>("Key2", new []{"joe","blog","doe"}), 
      new KeyValuePair<string, string[]>("Key3", new []{"jon","blog"}), 
     }; 

現在我實現

我目前的實現搜索,但所有的表達式都是「AND」而不是。我不知道如何編寫它。

public class UserSearcher 
    { 
     private List<UserProfile> userProfiles; 
     public UserSearcher() 
     { 
      userProfiles = new List<UserProfile>(); 
     } 

     public static List<UserProfile> SearchProfiles(List<KeyValuePair<string, string[]>> filterList) 
     { 
      var list = new List<UserProfile>(); 
      var query = list.AsQueryable(); 

      // search for each pair inside as or 
      foreach (KeyValuePair<string, string[]> searchPair in filterList) 
      { 
       foreach (string searchString in searchPair.Value) 
       { 
        string s = searchString; 
        // search for each item inside as and (has to contains all search strings 
        query = query.Where(x => x.PersonName.Contains(s)); 
       } 
      } 
      return list = query.ToList(); 
     } 
    } 

完整的例子,除了db是: https://gist.github.com/cpoDesign/acf69bc242ed0755597d

+0

我最近通過EF實現搜索經驗使我相信,手工SQL是這樣的去尋找性能方面的原因。 –

+0

@SamAxe也是我關心的,thnx的小費 – cpoDesign

回答

0

所以,如果我這樣做是正確,你想找回列表UserProfile其中PersonNameKeyValuePair列表的任何string[]內。

如果是的話,試試這個:

public static List<UserProfile> SearchProfiles(List<KeyValuePair<string, string[]>> filterList) 
{ 
    var list = new List<UserProfile>(); 

    return list.Where(profile => filterList.Any(kvp => kvp.Value.Contains(profile.PersonName))).ToList(); 
} 

測試例如:

Test image

0
public static Expression<Func<T,bool>> 
     Or<T>(IEnumerable<Expression<Func<T,bool>>> expList){ 
    ParameterExpression pe = Expression.Parameter(typeof(T)); 
    Expression r = null; 
    foreach(var exp in expList){ 
     r = r == null ? exp : Expression.Or(r,exp); 
    } 
    return Expression.Lambda<Func<T,bool>>(r.Body,pe); 
} 



var orList = new List<Expression<Func<T,bool>>>(); 
foreach (KeyValuePair<string, string[]> searchPair in filterList) 
{ 
    foreach (string searchString in searchPair.Value) 
    { 
      string s = searchString; 
      // search for each item inside as and 
      // (has to contains all search strings 
       orList.Add(x => x.PersonName.Contains(s)); 
     } 
} 

query = query.Where(Or(expList));