C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式
可能你还感兴趣:
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 的表达式的更多相关文章
- C# Lambda 表达式学习之(三):动态构建类似于 c => c.Age == null || c.Age > 18 的表达式
可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...
- ZooKeeper学习第四期---构建ZooKeeper应用
一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那些公共的部分.简单地说,ZooKeeper可以作为一个具有高可用性的配置存储器,允许分布式应用的参与者检索和 ...
- ZooKeeper学习第四期---构建ZooKeeper应用(转)
转载来源:https://www.cnblogs.com/sunddenly/p/4064992.html 一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那 ...
- Maven学习(十四)-----Maven 构建配置文件
Maven 构建配置文件 什么是构建配置文件? 生成配置文件是一组可以用来设置或覆盖 Maven 构建配置值的默认值.使用生成配置文件,你可以针对不同的环境,如:生产V/S开发环境自定义构建. 配置文 ...
- [C#.NET 拾遗补漏]13:动态构建LINQ查询表达式
最近工作中遇到一个这样的需求:在某个列表查询功能中,可以选择某个数字列(如商品单价.当天销售额.当月销售额等),再选择 小于或等于 和 大于或等于 ,再填写一个待比较的数值,对数据进行查询过滤. 如果 ...
- 动态构建Lambda表达式实现EF动态查询
在使用Entity Framework做数据查询的时候,查询条件往往不是固定的,需要动态查询.可以通过动态构建Lamda表达式来实现动态查询. Lamda表达式 使用Lamda表达式可以很方便的按条件 ...
- C# 动态构建表达式树(一)—— 构建 Where 的 Lambda 表达式
C# 动态构建表达式树(一)-- 构建 Where 的 Lambda 表达式 前言 记得之前同事在做筛选功能的时候提出过一个问题:如果用户传入的条件数量不确定,条件的内容也不确定(大于.小于和等于), ...
- Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制
回到目录 Lind.DDD框架里提出了对数据集的控制,某些权限的用户为某些表添加某些数据集的权限,具体实现是在一张表中存储用户ID,表名,检索字段,检索值和检索操作符,然后用户登陆后,通过自己权限来构 ...
- 通过动态构建Expression Select表达式并创建动态类型来控制Property可见性
通过动态构建Expression Select表达式并创建动态类型来控制Property可见性 项目中经常遇到的一个场景,根据当前登录用户权限,仅返回权限内可见的内容.参考了很多开源框架,更多的是在V ...
随机推荐
- 快速排序 and 拉格朗日插值查找
private static void QuictSort(int[] zu, int left, int right) { if (left < right) { ; ; ]; while ( ...
- GitHub:我们是这样弃用jQuery的
摘要: 技术债清理流程指南. 原文:Removing jQuery from GitHub.com frontend 译文:GitHub:我们为什么会弃用jQuery? 作者:GitHub 前端工程团 ...
- 用函数式编程对JavaScript进行断舍离
译者按: 当从业20的JavaScript老司机学会函数式编程时,他扔掉了90%的特性,也不用面向对象了,最后发现了真爱啊!!! 原文: How I rediscovered my love for ...
- javascript中call()、apply()的区别
call().apply()的区别: 相同点: 1.call()和apply()都可以用来间接调用函数,都可以显式调用所需的this.即,锚点滑动任何函数可以作为任何对象的方法来调用. 2.两个方法都 ...
- <自动化测试方案_4>第四章、选型标准
第四章.选型标准 1,免费 2,工具可维护.可扩展 3,支持团队工作
- Django 自带认证功能auth模块和User对象的基本操作
一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: authenticate() ...
- Spark Standalone 提交模式
一.Client提交模式 提交命令: ./spark-submit --master spark://node1:7077 --class org.apache.spark.examples.Spar ...
- ORACLE等待事件:SQL*Net message from client & SQL*Net message to client
在ORACLE当中有两个很常见的等待事件"SQL*Net message from client"与"SQL*Net message to client",两者 ...
- JQuery实现全选、全不选和反选功能
看重点就行了,最后面给一个网页完整的代码 代码实例: function selectStu() { $.ajax("StuList",{ type:"post" ...
- java笔记--对信号量Semaphore的理解与运用
java Semaphore 信号量的使用: 在java中,提供了信号量Semaphore的支持. Semaphore类是一个计数信号量,必须由获取它的线程释放, 通常用于限制可以访问某些资源(物理或 ...