可能你还感兴趣:

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:

02:

谢谢浏览!

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

  1. C# Lambda 表达式学习之(三):动态构建类似于 c => c.Age == null || c.Age > 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学习(十四)-----Maven 构建配置文件

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

  5. [C#.NET 拾遗补漏]13:动态构建LINQ查询表达式

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

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

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

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

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

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

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

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

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

随机推荐

  1. trivial and nontrivial

    Trivial A solution or example that is ridiculously simple and of little interest. Often, solutions o ...

  2. SaaS技术栈的走势

    本地部署时代 在软件还是“本地部署(on-premise)”的时候,SaaS的版图被大型玩家把持着,几乎所有的垂直领域(营销.支持.销售.人力)都被微软.SAP等大公司的解决方案占据.那时候的用户并没 ...

  3. 如何将字符串格式的对象转换成真正的js对象?

    1.如何将字符串格式的对象转换成真正的js对象? <script>//eval 的作用eval('var a = 100');console.log(a);</script> ...

  4. 10;XHTML 其他标记

    1.自动展示网页内容 2.如何让别人找到你的网页 3.活动文字:<marquee>…</marquee> 4.在网页中加入脚本程序 10.1 10.1 10.1 10.1 自动 ...

  5. Redis 保护模式

    默认 redis 启用了保护模式,即如果是远程链接不能进行 CRUD 等操作,如果进行该操作报错如下 (error) DENIED Redis is running in protected mode ...

  6. JavaScript面向对象编程指南(三) 函数

    第3章 函数 3.1 什么是函数 函数:本质是一种代码的分组形式.函数的声明如下: <script type="text/javascript"> /*函数的声明组成: ...

  7. tsung HTTP协议统计报告分析

    tsung HTTP协议统计报告分析 by:授客 QQ:1033553122 1.   Main Static l  higest 10sec mean: 基于每10s的统计,最大耗时 l  lowe ...

  8. Testlink1.9.17使用方法(第十一章 其他易用性功能)

    第十一章 其他易用性功能 QQ交流群:585499566 一. 自定义 一). 自定义字段管理 在主页点击[自定义字段管理]按钮-->进入自定义字段管理页面,点击[创建]按钮,可以创建一个字段, ...

  9. C#:读取视频的宽度和高度等信息

    读取方式:使用ffmpeg读取,所以需要先下载ffmpeg.网上资源有很多. 通过ffmpeg执行一条CMD命令可以读取出视频的帧高度和帧宽度信息. 如图: 蓝线框中可以看到获取到的帧高度和帧宽度. ...

  10. pyinstaller使用错误 SyntaxError: Non-UTF-8 code starting with '\xb4' in file C:......

    注:我的博客原本在CSDN,现转到博客园,图片采用以前的图片,并没有盗图.​​ 在将.py文件打包时,出现了下列错误 >>C:\Users\小呆\PycharmProjects\pycha ...