C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式

时间:2022-09-07 18:46:36

可能你还感兴趣:

1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到

2. C# Lambda 表达式学习之(二):LambdaExpression 实战练习

3. 基于 Entity Framework FluentAPI 思想的强类型的 Lambda Expressions 实体映射

4. C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式

直接贴代码了:

Post.cs

public class Post
{
public int Id { get; set; } public string PostTitle { get; set; } public int BlogId { get; set; } }

Program.cs

static void Main(string[] args)
{
using (var context = new BloggingContext())
{
//下面是有数据2
Expression<Func<Post, bool>> conditionExps3 =
LambdaExtensionsIn.BuildPropertyInExpression<Post>("BlogId", new List<int?>() { , , null, });
var query14 = context.Set<Post>().Where(conditionExps3); Console.WriteLine();
}
Console.ReadLine();
}

LambdaExtensionsIn.cs

    public class LambdaExtensionsIn
{
/// <summary>
/// 构建 属性A等于值1 或者 属性A等于值2 或者 属性A等于值3 等等一个或多个 OrElse 的表达式
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="propName"></param>
/// <param name="values"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> BuildPropertyInExpression<T>(string propName, IEnumerable values)
{
ParameterExpression x = Expression.Parameter(typeof(T), "x");
LambdaExpression expr;
var tempExp = BuildPropertyInExpressionCore(x, propName, values);
if (tempExp == null)
{
expr = Expression.Lambda(LambdaExpression.Constant(false), x);
}
else
{
expr = Expression.Lambda(tempExp, x);
}
return (Expression<Func<T, bool>>)expr;
} /// <summary>
/// 构建属性等于单个值的表达式
/// </summary>
/// <param name="x"></param>
/// <param name="propName"></param>
/// <param name="id"></param>
/// <returns></returns>
private static BinaryExpression BuildPropertyEqualsSingleValueExpression(ParameterExpression x, string propName, object id)
{
MemberExpression left = Expression.Property(x, propName);
ConstantExpression right = Expression.Constant(id);
return Expression.Equal(left, right);
} /// <summary>
/// 构建 属性A等于值1 或者 属性A等于值2 或者 属性A等于值3 等等一个或多个 OrElse 的表达式的核心
/// </summary>
/// <param name="x"></param>
/// <param name="propName"></param>
/// <param name="values"></param>
/// <returns></returns>
private static BinaryExpression BuildPropertyInExpressionCore(ParameterExpression x, string propName, IEnumerable values)
{
if (values == null)
{
throw new ArgumentNullException("values");
}
IEnumerator enumerator = values.GetEnumerator();
int i = ;
BinaryExpression binaryExp = null;
while (enumerator.MoveNext())
{
object objValue = enumerator.Current;
if (objValue == null)
{
continue;
}
if (i == )
{
binaryExp = BuildPropertyEqualsSingleValueExpression(x, propName, objValue);
i++;
continue;
}
binaryExp = Expression.OrElse(binaryExp, BuildPropertyEqualsSingleValueExpression(x, propName, objValue));
i++;
}
return binaryExp;
}
}

运行截图:

01:

C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 ||  c => c.Age == 17 等等一个或多个 OrElse  的表达式

02:

C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 ||  c => c.Age == 17 等等一个或多个 OrElse  的表达式

谢谢浏览!

C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式的更多相关文章

  1. C&num; Lambda 表达式学习之(三):动态构建类似于 c &equals;&gt&semi; c&period;Age &equals;&equals; null &vert;&vert; c&period;Age &gt&semi; 18 的表达式

    可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...

  2. ZooKeeper学习第四期---构建ZooKeeper应用

    一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那些公共的部分.简单地说,ZooKeeper可以作为一个具有高可用性的配置存储器,允许分布式应用的参与者检索和 ...

  3. ZooKeeper学习第四期---构建ZooKeeper应用(转)

    转载来源:https://www.cnblogs.com/sunddenly/p/4064992.html 一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那 ...

  4. Maven学习&lpar;十四&rpar;-----Maven 构建配置文件

    Maven 构建配置文件 什么是构建配置文件? 生成配置文件是一组可以用来设置或覆盖 Maven 构建配置值的默认值.使用生成配置文件,你可以针对不同的环境,如:生产V/S开发环境自定义构建. 配置文 ...

  5. &lbrack;C&num;&period;NET 拾遗补漏&rsqb;13:动态构建LINQ查询表达式

    最近工作中遇到一个这样的需求:在某个列表查询功能中,可以选择某个数字列(如商品单价.当天销售额.当月销售额等),再选择 小于或等于 和 大于或等于 ,再填写一个待比较的数值,对数据进行查询过滤. 如果 ...

  6. 动态构建Lambda表达式实现EF动态查询

    在使用Entity Framework做数据查询的时候,查询条件往往不是固定的,需要动态查询.可以通过动态构建Lamda表达式来实现动态查询. Lamda表达式 使用Lamda表达式可以很方便的按条件 ...

  7. C&num; 动态构建表达式树(一)—— 构建 Where 的 Lambda 表达式

    C# 动态构建表达式树(一)-- 构建 Where 的 Lambda 表达式 前言 记得之前同事在做筛选功能的时候提出过一个问题:如果用户传入的条件数量不确定,条件的内容也不确定(大于.小于和等于), ...

  8. Lind&period;DDD&period;ExpressionExtensions动态构建表达式树,实现对数据集的权限控制

    回到目录 Lind.DDD框架里提出了对数据集的控制,某些权限的用户为某些表添加某些数据集的权限,具体实现是在一张表中存储用户ID,表名,检索字段,检索值和检索操作符,然后用户登陆后,通过自己权限来构 ...

  9. 通过动态构建Expression Select表达式并创建动态类型来控制Property可见性

    通过动态构建Expression Select表达式并创建动态类型来控制Property可见性 项目中经常遇到的一个场景,根据当前登录用户权限,仅返回权限内可见的内容.参考了很多开源框架,更多的是在V ...

随机推荐

  1. 属性类:Properties

    属性是程序中经常出现的形式. 在类集中提供了一种专门的Properties类. public class Propertiesextends Hashtable<Object,Object&gt ...

  2. nginx下目录浏览及其验证功能配置记录

    工作中常常有写不能有网页下载东西的需求,在Apache下搭建完成后直接导入文件即可达到下载/显示文件的效果;而Nginx的目录列表功能默认是关闭的,如果需要打开Nginx的目录列表功能,需要手动配置, ...

  3. SOA架构介绍和理解

    SOA架构介绍和理解 SOA的正确方法论及目标模型,其实SOA在实现架构落地上,需要考虑到对服务的组合,不断的重用现有的服务,让企业应用可以逐步集成,快速实现业务的迭代. 通过SOA架构分层将服务按照 ...

  4. 【要什么自行车】ASP&period;NET MVC4笔记01:Asp&period;net MVC 分页,采用 MvcPager 和CYQ&period;Data来分页

    Control: ) { ; ; using (MAction action = new MAction("brain")) { MDataTable table = action ...

  5. Undefined symbols for architecture i386&colon; &quot&semi;MyGetOpenALAudioData&lpar;&lowbar;&lowbar;CFURL const&ast;&comma; int&ast;&comma; int&ast;&comma; int&ast;&rpar;&quot&semi;

    今天把apple developer上的例子程序oalTouch中的MyOpenALSupport.h和MyOpenALSupport.c添加到自己的工程中,并在另一个文件xxx.cpp里调用,结果出 ...

  6. php必看六本书

    php和mysql web开发 PHP高级程序设计_模式.框架与测试.pdf  PHP专业项目实例开发.pdf PHP5高级应用开发实践.pdf [深入PHP面向对象.模式与实践(第2版)].(美)赞 ...

  7. TFS Build Definition

    1.  TFS Build 简介 在团队项目开发中,编译常常是一个很困难的事情! 可能你会反问编译有什么难的?不就是右键,然后点击 Build/Rebuild, 或者直接按 F5 么?这都不会,真不知 ...

  8. 怎样在ASP&period;NET&lpar;C&num;&rpar; 使用Json序列化反序列化问题?

    using System; using System.Collections.Generic; using System.Web; using System.Web.Script.Serializat ...

  9. Top 命令解析

    TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中C ...

  10. BZOJ &lbrack;FJOI2007&rsqb;轮状病毒 &lpar;找规律&rpar;

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 6009  Solved: 3282[Submit][Statu ...