如何用lambda表达式 写任意条件组合的搜索语句呢

zmidl 2014-04-30 12:15:36
如题
我有5个字段 a、 b、c、d、e。
我需要搜索满足条件 a=1的数据
list.Where(obj => obj.a==1)

有时候我需要同时满足b=2
list.Where(obj => obj.a==1 && obj.b==2)

我的问题是我需要随机组合不同搜索条件 的时候 我如何灵活的写搜索条件语句呢
比如有时我要a=1 b=2 d=4 有时我只要 c=3 e=5 如何写一个面向对象的搜索函数呢?

...全文
5076 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmidl 2014-05-24
  • 打赏
  • 举报
回复
引用 8 楼 wg5945 的回复:
对你来说你可以这么用

Expression<Func<XXX, bool>> expression = t => true;
expression = expression.And(t => t.AAA == 1);
expression = expression.And(t => t.BBB > 1);
var ds = products.AsQueryable().Where(expression).ToList();

追问下 第一句 t=true 是做什么的? 模糊搜索吗?
zmidl 2014-04-30
  • 打赏
  • 举报
回复
引用 11 楼 wg5945 的回复:
怎么了? [quote=引用 9 楼 zmidl 的回复:] [quote=引用 7 楼 wg5945 的回复:] 以前收藏过~~

    public static class PredicateExtensions
    {
        public static Expression<Func<T, bool>> True<T>()
        {
            return f => true;
        }

        public static Expression<Func<T, bool>> False<T>()
        {
            return f => false;
        }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
        {
            var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>(Expression.Or(expression1.Body, invokedExpression), expression1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
        {
            var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>(Expression.And(expression1.Body, invokedExpression), expression1.Parameters);
        }
    }
这个。。。[/quote][/quote] 最近才玩这个 被怔住了,虽然看的一头雾水。 先不管这个,反正这个用起来不错,我只管把需要判断的条件往ADD里放就自动给我拼复合条件,准备好好学学lambda语法。 还有为什么很多 模块呀接口呀 都用静态修饰符呢,除了需要不要的时候 我几乎不用静态方法的。
wg5945 2014-04-30
  • 打赏
  • 举报
回复
怎么了?
引用 9 楼 zmidl 的回复:
[quote=引用 7 楼 wg5945 的回复:] 以前收藏过~~

    public static class PredicateExtensions
    {
        public static Expression<Func<T, bool>> True<T>()
        {
            return f => true;
        }

        public static Expression<Func<T, bool>> False<T>()
        {
            return f => false;
        }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
        {
            var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>(Expression.Or(expression1.Body, invokedExpression), expression1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
        {
            var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>(Expression.And(expression1.Body, invokedExpression), expression1.Parameters);
        }
    }
这个。。。[/quote]
iceMung 2014-04-30
  • 打赏
  • 举报
回复
        List.Where(new Func<Class, bool>(Where));

        private bool Where(Class c)
        {
            //组织表达式,返回bool
        }
这个应该相对灵活一点点,不知道能不能满足你的要求,7楼那个不错。
zmidl 2014-04-30
  • 打赏
  • 举报
回复
引用 7 楼 wg5945 的回复:
以前收藏过~~

    public static class PredicateExtensions
    {
        public static Expression<Func<T, bool>> True<T>()
        {
            return f => true;
        }

        public static Expression<Func<T, bool>> False<T>()
        {
            return f => false;
        }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
        {
            var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>(Expression.Or(expression1.Body, invokedExpression), expression1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
        {
            var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>(Expression.And(expression1.Body, invokedExpression), expression1.Parameters);
        }
    }
这个。。。
wg5945 2014-04-30
  • 打赏
  • 举报
回复
对你来说你可以这么用

Expression<Func<XXX, bool>> expression = t => true;
expression = expression.And(t => t.AAA == 1);
expression = expression.And(t => t.BBB > 1);
var ds = products.AsQueryable().Where(expression).ToList();

wg5945 2014-04-30
  • 打赏
  • 举报
回复
以前收藏过~~

    public static class PredicateExtensions
    {
        public static Expression<Func<T, bool>> True<T>()
        {
            return f => true;
        }

        public static Expression<Func<T, bool>> False<T>()
        {
            return f => false;
        }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
        {
            var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>(Expression.Or(expression1.Body, invokedExpression), expression1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
        {
            var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>(Expression.And(expression1.Body, invokedExpression), expression1.Parameters);
        }
    }
zmidl 2014-04-30
  • 打赏
  • 举报
回复
引用 3 楼 Z65443344 的回复:
自己定义一个函数 void listSelect(List list,obj a,string objName) +4重载 void listSelect(List list,obj a,obj b,string objName1,string objName2) ...
小学语文课 有个文章叫"记账"说的就是这个方法 要是我有个100个字段呢?我写排列组合写死啊。
宝_爸 2014-04-30
  • 打赏
  • 举报
回复
参考这个帖子: LINQ - dynamic WHERE clause? http://stackoverflow.com/questions/848415/linq-dynamic-where-clause
於黾 2014-04-30
  • 打赏
  • 举报
回复
自己定义一个函数 void listSelect(List list,obj a,string objName) +4重载 void listSelect(List list,obj a,obj b,string objName1,string objName2) ...
zmidl 2014-04-30
  • 打赏
  • 举报
回复
引用 1 楼 xdashewan 的回复:
自己对Where进行一次封装不就好了
你告诉我 具体怎么写呀 问的就是具体的 以前用sql语句 可以用字符串拼啊 现在怎么实现?
xdashewan 2014-04-30
  • 打赏
  • 举报
回复
自己对Where进行一次封装不就好了

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧