使用PredicateBuilder问题在列表中搜索 [英] Search in list using PredicateBuilder problem

查看:105
本文介绍了使用PredicateBuilder问题在列表中搜索的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好。

我正在尝试创建动态谓词,以便它可以用于过滤列表

我有一个类:

Hi all.
I am trying to create dynamic predicate so that it can be used against a list for filtering
I have a class:

public  class MyClass
        {
            public  string Name { get; set; }
            public string Address { get; set; }
        }



和IList< myclass> data = new List< myclass>();



我想通过名称或地址,名称或地址类似输入搜索我的数据(例如:input = t %g)。

名称喜欢输入或地址喜欢输入



这是我的帮手




And IList<myclass> data = new List<myclass>();

I want to search in my data by Name Or Address, and Name or Address Like input(ex: input=t%g).
Name Like input Or Address Like input

Here is my helper

public static Expression<Func<T, bool>> StringLike<T>(Expression<Func<T, string>> selector, Expression<Func<T, string>> selector1, string pattern)
        {
            var predicate = PredicateBuilder.True<T>();
            var predicate1 = PredicateBuilder.True<T>();
            var parts = pattern.Split('%');
            if (parts.Length == 1) // not '%' sign
            {
                predicate = predicate.And(s => selector.Compile()(s) == pattern);
                predicate1 = predicate1.And(s => selector1.Compile()(s) == pattern);
            }
            else
            {
                for (int i = 0; i < parts.Length; i++)
                {
                    string p = parts[i];
                    if (p.Length > 0)
                    {
                        if (i == 0)
                        {
                            predicate = predicate.And(s => selector.Compile()(s).StartsWith(p));
                            predicate1 = predicate1.And(s=>selector1.Compile()(s).StartsWith(p));
                        }
                        else if (i == parts.Length - 1)
                        {
                            predicate = predicate.And(s => selector.Compile()(s).EndsWith(p));
                            predicate1 = predicate1.And(s => selector1.Compile()(s).EndsWith(p));
                        }
                        else
                        {
                            predicate = predicate.And(s => selector.Compile()(s).Contains(p));
                            predicate1 = predicate1.And(s => selector1.Compile()(s).Contains(p));
                        }
                    }
                }
            }
            var test = Expression.Lambda<Func<T, bool>>(Expression.Or(predicate, predicate1));
            return test;
        }





主要功能:





In main function:

var expr = ExpressionHelper.StringLike<myclass>(x => x.Name,x=>x.Address, text);
data = data.Where(expr.Compile()).ToList();





我遇到以下异常:

二进制运算符Or未定义类型'System.Func`2 [ConsoleApplication1.Program + MyClass,System.Boolean]'和'System.Func`2 [ConsoleApplication1.Program + MyClass ,System.Boolean]'。



任何帮助表示赞赏!谢谢! :)



I run into the following exception:
The binary operator Or is not defined for the types 'System.Func`2[ConsoleApplication1.Program+MyClass,System.Boolean]' and 'System.Func`2[ConsoleApplication1.Program+MyClass,System.Boolean]'.

Any help is appreciated! Thanks! :)

推荐答案

请帮帮我。

非常感谢你。
please help me.
Thanks you very much.


这篇关于使用PredicateBuilder问题在列表中搜索的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆