ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

c# 用Expression表达式 解决类似于sql中 select 中 in 的查询

2022-04-29 15:00:25  阅读:143  来源: 互联网

标签:string c# Expression optionId typeof sql expression select left


由于项目中需要,需要实现类似于sql语句中select里面in的查询语法,

所以上网搜查了下资料,由于时间关系,以下资料简略,后续再补充。。。

 

需要实现,下面的效果

sql:... where Id in (4,6,....)

someList.where(c=> c.Id==4 || c.Id==6 || ...)

        public static Expression<Func<T, bool>> GetConditionExpression<T>(int[] options, string proName)
        {
            //1)声明一个变量c
            ParameterExpression left = Expression.Parameter(typeof(T), "c");//c=>
            Expression expression = Expression.Constant(false);

            //常量值数组:options
            foreach (var optionId in options)
            {
                //2)c.属性 调用c.的属性--T的属性proName,先获取属性
                //a、 获取属性--通过反射
                PropertyInfo proInfo = typeof(T).GetProperty(proName);
                //b、 c.fieldName  通过left来调用
                MemberExpression memberExpression = Expression.Property(left, proInfo);

                //3)== Equeals是个方法,是属性proName的方法
                //a、 常量optionId
                ConstantExpression constant = Expression.Constant(optionId, typeof(int));
                //b、 c.proName==常量optionId
                Expression right = Expression.Equal(memberExpression, constant);

                expression = Expression.Or(right, expression);
                //c.Id==optionId || c.Id==optionId ||... 

            }
            Expression<Func<T, bool>> finalExpression
                = Expression.Lambda<Func<T, bool>>(expression, new ParameterExpression[] { left });
            return finalExpression;
        }

 

运行截图:

 

 

最后拼接的效果

 

 

 

参考的资料:

看到此图后大家肯定会说,这很简单嘛

将所有的选项 拼成“'1-3','5-9'”  然后放到 in 的字句后面,一查就出来了。

这样做的确在逻辑上没有问题,可是大家有没有想过这个问题,过度的和业务耦合虽然能够解决

现在的需求但是却牺牲了代码优雅和可维护性

 

查询的目的要实现这样的效果 ,

 someList.where(c=>c.Name.contains("someName")||c.Name.Contains("someName")||...)

 public static Expression<Func<T, bool>> GetConditionExpression<T>(string[] options, string fieldName)
        {
            ParameterExpression left = Expression.Parameter(typeof(T), "c");//c=>
            Expression expression = Expression.Constant(false);
            foreach (var optionName in options)
            {
                Expression right = Expression.Call
                       (
                          Expression.Property(left, typeof(T).GetProperty(fieldName)),  //c.DataSourceName
                          typeof(string).GetMethod("Contains", new Type[] { typeof(string) }),// 反射使用.Contains()方法                         
                         s Expression.Constant(optionName)           // .Contains(optionName)
                       );
                expression = Expression.Or(right, expression);//c.DataSourceName.contain("") || c.DataSourceName.contain("") 
            }
            Expression<Func<T, bool>> finalExpression
                = Expression.Lambda<Func<T, bool>>(expression, new ParameterExpression[] { left });
            return finalExpression;
        }

 

本文引自:

https://www.cnblogs.com/JimmyZheng/archive/2012/02/23/2364154.html

https://blog.csdn.net/liyou123456789/article/details/119967779

 

标签:string,c#,Expression,optionId,typeof,sql,expression,select,left
来源: https://www.cnblogs.com/ggll611928/p/16206692.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有