可能你还感兴趣:

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. 9.并发_EJ

    第66条: 同步访问共享可变的数据 所谓同步指的发出一个调用时,如果没有得到结果就不返回,直到有结果后再返回.另外相对应的是异步,指的是发出一个调用时就立即返回而不在乎此时有没有结果. 同步和异步关注 ...

  2. 使用EF保存数据时 提示: 其他信息: 对一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。

    错误提示: 解决方法: →使用try...catch捕获→在catch所在行打上断点,运行,对ex添加监视或者运行到ex的时候  按Shift+f9天假快速监视→在EntityValidationEr ...

  3. unable to locate nuget.exe

    今日使用vs 从github fork 一份代码到本地之后,提示项目 unable to locate nuget.exe. 原因:代码托管时未提交 nuget.exe 或其他原因丢失 解决方法:在解 ...

  4. 微信分享链接出现config:invalid signature错误的解决方法

    首先贡献jssdk下载地址:http://demo.open.weixin.qq.com/jssdk/sample.zip  不建议大家在*SDN上花钱买积分下载 当开发微信时需要做特定的页面做分享时 ...

  5. CSS制作镂空字体

    1.效果图 2.html内容: <!doctype html><html lang="en"><head> <meta charset=& ...

  6. js 时间戳转换为‘yyyy-MM-dd hh:mm’格式(es6语法)

    function formatDate(date,fmt) { if(/(y+)/.test(fmt)){ fmt = fmt.replace(RegExp.$1,(date.getFullYear( ...

  7. elementUI vue 页面加载的时候页面出现了黑字 页面优化处理 按钮弹出框文字

    elementUI 页面如果需要加载很多东西的时候, 自己定义的按钮或者弹出框dialog的文字就会显示在页面上, 一闪而过, 因此需要优化一下, elementUI 提供的loading有遮罩层, ...

  8. vue从入门到进阶:过滤器filters(五)

    Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持).过滤器应该被添加在 JavaScrip ...

  9. 活字格对接RF手持机与ERP系统,帮助RFID快速盘点方案落地

    这个玩意有点意思,要不要搞来玩玩? ----------- 射频技术(RF)是Radio Frequency的缩写,较常见的应用有无线射频识别(Radio Frequency Identificati ...

  10. WPF:Metro样式ProgressBar(圆点横向移动),自适应宽度

    先看效果图: 最直观的,这是4个圆点在移动,就用一个横向的StackPanel表示这四个点吧. <StackPanel Orientation="Horizontal"> ...