如何使用OR而不是和

时间:2015-07-12 10:59:33

标签: c# entity-framework

我需要根据以下标准编写搜索:

我需要找到所有匹配值的记录 key1 OR key2 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”而不是 OR 。我不知道怎么写。

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

3 个答案:

答案 0 :(得分:0)

使用Predicate Builder - 效果很好。

答案 1 :(得分:0)

所以,如果我做对了,你想要找回UserProfile的{​​{1}}列表,其中PersonName位于string[]列表的KeyValuePair内。

如果是这样,试试这个:

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

答案 2 :(得分: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));