如何用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 如何写一个面向对象的搜索函数呢?

...全文
4993 13 打赏 收藏 转发到动态 举报
写回复
用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进行一次封装不就好了
LINQPad是一款由Joseph Albahari编的免费独立应用程序,并是C# 3.0 in a Nutshell一书中的附加程序。基本上,LINQPad是集成了IDE和SQL的LINQ解析器。LINQPad有简单而实用的用户界面,可即时执行LINQ查询,包括LINQ to SQL、LINQ to Objects和LINQ to XML等多语句查询。LINQPad UILINQPad提供了多种执行模式: C# (或 VB)表达式 可执行单条C#或VB的LINQ表达式,并在结果窗格中显示最终的对象 C# (或 VB)语句 可执行多条C#或VB的LINQ表达式,LINQPad有Dump扩展方法,在执行期间发送对象和文本到结果窗格 C# (或 VB)程序 在Main()函数中编要执行的代码,可在LINQPad编辑器中定义其他类型和方法进行测试。 SQL 使用SQL支持特定数据查询记住LINQPad可执行任意C#或VB.NET代码非常重要,并不仅仅是LINQ表达式。这也意味着对于要进行简单测试的任何简短代码,LINQPad非常有用,例如:棘手的数字格式字符串或者匹配正则表达式。LINQPad含有用于显示LINQ细微差别和功能的多个LINQ示例表达式,包括初学者示例和更高级的概念,如:延迟执行和投影。LINQPad还有多用途分析功能,即显示结果的多种选择: 默认结果视图 由语句返回的对象和文本的简单图形 Lambda视图 LINQ表达式转换为可用的Lambda表达式 SQL视图 LINQ表达式转换为可用的SQL IL视图 针对代码生成的微软中间语言 LINQPad允许用户引用自定义程序集和导入自定义命名空间来进行扩展。通过这种扩展可以支持LINQ to Entities。 除了是学习和测试工具以外,LINQPad 针对SQL数据库执行特定查询方面越来越受欢迎。
《程序设计方法》以Scheme语言为基础介绍计算和程序设计的一般理论和实践。《程序设计方法》由8个部分和7个独立的章节(第8、13、18、24、29、33、38章)组成。8个部分主要讨论程序设计,独立章节则介绍一些与程序设计和计算相关的话题。《程序设计方法》第1至第3部分介绍了基于数据驱动的程序设计基础。第4部分介绍了程序设计中的抽象问题。第5部分和第6部分是与递归及累积相关的内容。《程序设计方法》的最后两部分说明了设计程序的意义,阐述了如何应用前6个部分所描述的程序设计诀窍,以及使用赋值语句必须特别小心的一些问题。 《程序设计方法》可作为高等院校计算机科学与技术专业“程序设计导论”和“计算导论”的教材和教学参考书,也可作为函数式语言和Scheme语言的入门教材。 目录 · · · · · · 第一部分 简单数据的处理 第1章 学生、教师和计算机 3 第2章 数、表达式和简单程序 5 2.1 数和算术运算 5 2.2 变量和程序 6 2.3 字处理问题 9 2.4 错误 10 2.5 设计程序 12 第3章 程序就是函数加上变量定义 15 3.1 函数复合 15 3.2 变量定义 17 3.3 函数复合练习 18 第4章 条件表达式和函数 20 4.1 布尔类型和关系 20 4.2 函数和条件测试 22 4.3 条件条件函数 25 4.4 条件函数的设计 27 第5章 符号信息 31 第6章 复合数据之一:结构体 34 6.1 结构体 34 6.2 补充练习:绘制简单图形 36 6.3 结构体定义 38 6.4 数据定义 41 6.5 设计处理复合数据的函数 43 6.6 补充练习:圆和长方形的移动 46 6.7 补充练习:刽子手游戏 49 第7章 数据的多样性 52 7.1 数据混合与区分 52 7.2 设计处理混合数据的函数 55 7.3 再论函数复合 58 7.4 补充练习:图形的移动 60 7.5 输入错误 61 第8章 语法和语义 63 8.1 Scheme的词汇 63 8.2 Scheme的文法 64 8.3 Scheme的含义 65 8.4 错误 68 8.5 布尔值表达式 70 8.6 变量定义 71 8.7 结构体的定义 72 第二部分 任意数目数据的处理 第9章 复合数据类型之二:表 77 9.1 表 77 9.2 任意长的表的数据定义 80 9.3 处理任意长的表 82 9.4 设计自引用数据定义的函数 84 9.5 更多关于简单表的例子 86 第10章 表的进一步处理 90 10.1 返回表的函数 90 10.2 包含结构体的表 93 10.3 补充练习:移动图片 98 第11章 自然数 100 11.1 定义自然数 100 11.2 处理任意大的自然数 101 11.3 补充练习:创建表,测试函数 103 11.4 自然数的另一种数据定义 104 11.5 更多与自然数有关的性质 108 第12章 三论函数复合 110 12.1 设计复杂的程序 110 12.2 递归的辅助函数 111 12.3 问题泛化与函数泛化 114 12.4 补充练习:字母的重新排列 117 第13章 用list构造表 119 第三部分 再论任意大数据的处理 第14章 再论自引用数据定义 125 14.1 结构体中的结构体 125 14.2 补充练习:二叉搜索树 131 14.3 表中的表 135 14.4 补充练习:Scheme求值 137 第15章 相互引用的数据定义 139 15.1 由结构体组成的表与结构体中的表 139 15.2 为相互引用的定义设计函数 144 15.3 补充练习:网页再谈 145 第16章 反复精化设计 147 16.1 数据分析 147 16.2 定义数据类型,再改进它们 148 16.3 改进函数和程序 150 第17章 处理两种复杂数据片段 152 17.1 同时处理两个表:第一种情况 152 17.2 同时处理两个表:第二种情况 154 17.3 同时处理两个表:第三种情况 156 17.4 函数的简化 159 17.5 设计读入两个复杂输入的函数 160 17.6 处理两个复杂输入的练习 161 17.7 补充练习:Scheme求值之二 164 17.8 相等与测试 165 第18章 局部定义和辖域 172 18.1 用local组织程序 172 18.2 辖域和块结构 183 第四部分 抽象设计 第19章 定义的相似性 189 19.1 函数的类似之处 189 19.2 数据定义的类似之处 195 第20章 函数也是值 199 20.1 语法和语义 199 20.2 抽象函数和多态函数的合约 200 第21章 抽象设计的例子 204 21.1 从实例中抽象 204 21.2 抽

110,545

社区成员

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

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

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