[Practice Note] Net Expression表达式树拓展-And/or/orderby/orderthenby

2021-05-29 .NET高级班 16-表达式目录树扩展(And,Or,Not) #region 表达式链接 { Expression<Func<People, bool>> lambda1 = x => x.Age > 5; Expression<Func<People, bool>> lambda2 = x => x.Id > 5; Expression<Func<People, bool>> lambda3 = lambda1.And(lambda2); 阅读详情

Net Expression表达式树拓展

1.Expression-- And Or

public static class ExpressionExt
    {
        public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge)
        {
            var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);
            var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);
            return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
        }
        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
        {
            return first.Compose(second, Expression.And);
        }
        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
        {
            return first.Compose(second, Expression.Or);
        }

        public class ParameterRebinder : ExpressionVisitor
        {
            private readonly Dictionary<ParameterExpression, ParameterExpression> map;
            public ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
            {
                this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
            }
            public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp)
            {
                return new ParameterRebinder(map).Visit(exp);
            }
            protected override Expression VisitParameter(ParameterExpression p)
            {
                ParameterExpression replacement;
                if (map.TryGetValue(p, out replacement))
                {
                    p = replacement;
                }
                return base.VisitParameter(p);
            }
        }


    }

1.Expression-- Orderby/OrderThenBy

public static class QueryableExtensions
    {
        public static IOrderedQueryable<T> Ex_OrderBy<T>(this IQueryable<T> source, params KeyValuePair<String, Boolean>[] OrderByPropertyList) where T : class
        {
            if (OrderByPropertyList.Count() == 1) return source.Ex_OrderBy(OrderByPropertyList[0].Key, OrderByPropertyList[0].Value);
            if (OrderByPropertyList.Count() > 1)
            {
                var type = typeof(T);
                var param = Expression.Parameter(type, type.Name);
                Func<String, dynamic> KeySelectorFunc = _PropertyName =>
                {
                    return Expression.Lambda(Expression.Property(param, _PropertyName), param);
                };
                IOrderedQueryable<T> OrderedQueryable = OrderByPropertyList[0].Value
                    ? Queryable.OrderBy(source, KeySelectorFunc(OrderByPropertyList[0].Key))
                    : Queryable.OrderByDescending(source, KeySelectorFunc(OrderByPropertyList[0].Key));
                for (int i = 1; i < OrderByPropertyList.Length; i++)
                {
                    OrderedQueryable = OrderByPropertyList[i].Value
                        ? Queryable.ThenBy(OrderedQueryable, KeySelectorFunc(OrderByPropertyList[i].Key))
                        : Queryable.ThenByDescending(OrderedQueryable, KeySelectorFunc(OrderByPropertyList[i].Key));
                }
                return OrderedQueryable;
            }
            return null;
        }
        public static IOrderedQueryable<T> Ex_OrderBy<T>(this IQueryable<T> source, string OrderByPropertyName, bool IsOrderByAsc = true) where T : class
        {
            string command = IsOrderByAsc ? "OrderBy" : "OrderByDescending";
            var type = typeof(T);
            var property = type.GetProperty(OrderByPropertyName);
            var parameter = Expression.Parameter(type, "p");
            var propertyAccess = Expression.MakeMemberAccess(parameter, property);
            var orderByExpression = Expression.Lambda(propertyAccess, parameter);
            var resultExpression = Expression.Call(typeof(Queryable), command, new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExpression));
            return source.Provider.CreateQuery<T>(resultExpression) as IOrderedQueryable<T>;

            //
            //var param = Expression.Parameter(type, type.Name);
            //var body = Expression.Property(param, OrderByPropertyName);
            //dynamic keySelector = Expression.Lambda(body, param);

            //return IsOrderByDesc ? Queryable.OrderByDescending(source, keySelector) : Queryable.OrderBy(source, keySelector);
        }
    }

And Or 调用

实体模型:
class S_Student
{
	string Name ...
	int Age ...
	float Score ...
}
---------------------------------------------

Expression<Func<S_Student, bool>> expression1 = i => true;
if(条件1)
	expression1 =expression1.And(_=>_.Name="张三");
if(条件2)
	expression1 =expression1 .And(_=>_.Age>20)

var linq=_dbcontext.S_Student.where(expression1);

Orderby/ThenOrderby调用


KeyValuePair<string, bool> key = new KeyValuePair<string, bool>("实体属性名称", false); 
int index=0;
//遍历处理需要依次排序的keyvaluepair
foreach(.......)
{
	keyValue[index++] = key;
}
var linq = (from p .......
              select new 实体对象
               {
                     adt_CreateTime=p.adt_CreateTime,
                     Id = p.adt_Id,
                     Fix = f1.ItemContent.ToLower(),
                     Item = p.Item,
                     Type = f2.ItemContent.ToLower(),
                     Url = p.Url,
                     LinkText = p.LinkText,
                     ToolTip = p.ToolTip,
                     Target = (f3.ItemContent.ToLower() == TargetType.Blank.ToString() ? 0 : 1),
                  });     
                        
linq=linq.Ex_OrderBy(keyValue);

告别ORB-SLAM2?手把手教你用OpenVSLAM在Ubuntu 20.04上跑通第一个SLAM Demo(含依赖库避坑指南) 本文详细介绍了如何在Ubuntu 20.04系统上从ORB-SLAM2迁移到OpenVSLAM,包括环境配置、依赖库安装、编译调整及性能优化。OpenVSLAM凭借其模块化设计和多相机支持,在SLAM领域展现出显著优势,适合机器人导航和AR应用开发。文章还提供了实用的避坑指南和进阶技巧,帮助开发者高效完成迁移。 阅读详情

相关推荐

LightGBM处理类别特征和缺失值有多省心?一个真实业务数据案例带你上手

本文通过真实电商数据案例,详细解析了LightGBM如何高效处理类别特征和缺失值。相比传统方法,LightGBM仅需一行代码即可自动处理高基数类别特征和缺失值,大幅提升模型训练效率和预测准确度,特别适合业务场景中的脏数据处理。

weixin_30689307的博客 460

(十一).net表达式目录树Expression

表达式目录树Expression拆解,动态拼装,生成sql等

lwy 1849

kaggle项目:纽约出租车行程时间NYC Taxi Trip Duration

纽约出租车形成时间预测(NYC Taxi Trip Duration)是Kaggle中的一个Playground竞赛。比赛数据集基于2016年纽约市黄色出租车行程记录数据,需要建立一个模型,根据单个行程属性,预测测试集中每次行程的持续时间。Kaggle项目模型XGBoost,评价指标RMSLE。

weixin_42113929的博客 2790

[Linq]Expression OrderBy扩展

生成Expression<Func<T,TKey>>lambda表达式 然后调用内置方法 var type = typeof(T); var param = Expression.Parameter(type, type.Name); Func<String, dynamic&gt...

weixin_30666401的博客 869

ubuntu20.4源码安装最新gcc(gcc V12.2)

Ubuntu20.4自带的gcc为V9.4.0的版本,老版本的gcc存在不支持新版本C语言规范,在配置、编译、安装应用软件或工具时,可能存在不能正确安装的问题。(比如:libpqxx-7.7.4在配置时要求c++17版本的支持,但gcc V9.4.0版本不支持c++17)。因此本文介绍ubuntu20.4的系统下载最新gcc12.2版本源码,并进行本地编译、安装。本节内容包括gcc12.2的必备库安装和gcc12.2安装两部分内容组成。

q544344318的博客 1万+

自制非接触式静电探测仪:从振动电容原理到微弱信号检测实践

微弱信号检测是电子测量领域的核心挑战之一,尤其在需要避免物理接触或防止干扰的场景中。其基本原理在于将难以直接获取的微小物理量(如电流、电压)通过传感器转换为电信号,再经过放大、滤波等处理进行提取。锁相放大技术是解决这一问题的关键手段,它利用参考信号与目标信号的同步性,从强噪声背景中恢复出有效信息,极大提升了信噪比和测量灵敏度。这项技术的工程价值在于实现了对纳安级电流、微伏级电压等高难度参数的可靠测量。在静电防护、材料表面电位分析、生物电信号采集等应用场景中,非接触式测量需求广泛。本文聚焦的基于振动电容原理的

weixin_32349093的博客 274

【FreeSql】 实现动态排序(order by)

FreeSql实现动态orderby mysql

zhaoxingyu999的博客 1970

MIMO-OFDM 通信-感知一体化(ISAC)中的联合优化与性能权衡

本文深入探讨了MIMO-OFDM技术在通信-感知一体化(ISAC)系统中的核心作用与挑战。文章分析了如何通过联合优化资源分配、波束成形与波形设计,在有限的频谱与硬件资源下,实现通信速率与感知精度之间的最佳平衡,并指出了工程实践中面临的同步、干扰等关键难题。

dapp9builder的博客 215

c# ef 排序字段动态,构建动态Lambda和扩展方法OrderBy

1.动态构建排序Lambda /// <summary> /// 获取排序Lambda(如果动态排序,类型不同会导致转换失败) /// </summary> /// <typeparam name="T">数据字段类型</typeparam> /// &l...

weixin_30530523的博客 1499

图解转置卷积原理

声明:本文大部分搬运自【机器学习】详解 转置卷积 (Transpose Convolution) 感谢博主花与人间事同,本人只是在博主原创文章上做补充以及添加一些自己的理解。 1 转置卷积的背景 通常,对图像进行多次卷积运算后,特征图的尺寸会不断缩小。而对于某些特定任务 (如图像分割和图像生成等),需将图像恢复到原尺寸再操作。这个将图像由小分辨率映射到大分辨率的尺寸恢复操作,称为上采样 (Upsample),如下图所示: 上采样方法有很多,详见【图像处理】详解 最近邻插值、线性插值、双线性插值、双三次插值

laonafahaodange的博客 5685

【虚拟仿真】Unity3D中实现对大疆无人机遥控器手柄按键响应

最近项目中需要用到大疆无人机遥控器对程序中无人机进行控制,遥控器是下图这一款:博主发现接入手柄这块的可以参考的内容非常少,对于大疆遥控器的控制更是没有。博主经过一番研究,终于理通了这块的遥控器摇杆数据的控制。并且将解决思路分享出来,希望对大家有所帮助。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2819

C# 动态Expression

///         /// 扩展IQueryable方法        /// 可以直接.出来        ///         ///         ///         ///         ///         public static IQueryable GetTop(this IQueryable source,            Expression> Orde

foreverhot1019的博客 2117

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

表达式树使用(四)

运行结果如图:

极客神殿 824

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C# OrderBy 扩展

public enum OrderByStatus { ASC, DESC } public static class OrderByHelper { public static IOrderedQueryable OrderIf(this IQueryable source, Expression> order,

Moxie_Yan的专栏 2295

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

pgsql学习笔记:行排序

NULLS FIRST和NULLS LAST选项将可以被用来决定在排序顺序中,空值是出现在非空值之前或者出现在非空值之后。默认情况下,排序时空值被认为比任何非空值都要大,即NULLS FIRST是DESC顺序的默认值,而不是NULLS LAST的默认值。如果一个ORDER BY项是一个单一名字并且匹配一个输出列名或者一个表表达式的列,仍然会出现混淆。ORDER BY可以被应用于UNION、INTERSECT或EXCEPT组合的结果,但是在这种情况中它只被允许根据输出列名或编号排序,而不能根据表达式排序。

Code1s 781

C# .Net学习笔记—— Expression 表达式目录树

C#学习,表达式目录树

weixin_46711336的博客 2324

LINQ使用Orderby、ThenBy实现多字段的排序

LINQ中的排序操作符,包括:OrderBy、OrderByDescending、ThenBy、ThenByDescending、Reverse,提供了升序或者降序排序。 OrderBy:按升序对序列的元素进行排序。 OrderByDescending:按降序对序列的元素排序。 ThenBy:按升序对序列中的元素执行后续排序。 ThenByDescending:按降序对序列中的元素执行后续排序。 ...

pan_junbiao的博客 2万+

.NET Expression 从零开始三:运算符

本文介绍表达式中允许的运算符表达式,如一元、二元、三元运算符等等 会简易的提供几个运算应用的代码小示例 下面列出各个运算符表达式 一元运算符 ! // Expression.Not(Expression.Constant(false)); ~ // Expression.Not(Expression.Constant(0)); ++i // ParameterExpression i

liulilittle的博客 1509

.NET 使用Expression构造多条件动态查询表达式树方法

【代码】.NET 使用Expression构造多条件动态查询表达式树方法。

xk_hypothesis的博客 787

.NET Expression 从零开始四:结构化异常处理(SEH)

本文介绍在.NET Expression如何进行“结构化异常(SEH)”的处理,涵括对异常处理、抛出、清理等代码块的应用 与C#语法层面的try-catch-finally在表达式中的书写方式,那么如何捕获一个异常同时可以获取这个异常的错误信息呢?即需求“$exception”指针 对于调试而言这类的诉求是很必要的 毕竟你可以通过它捕获到的错误信息与堆栈跟踪 可以大致上确定到具体在哪一个位置发

liulilittle的博客 1102

C#(.net)中使用AND/OR条件拼接提高查询效率

定义and/or方法: void And(ref Expression<Func<EF生成的DB实体, bool>> left, Expression<Func<EF生成的DB实体, bool>> right) { ParameterExpression para = Expression.Paramete...

aiguoguo000的博客 2001

表达式目录树的拼接AND、Or、Not

表达式目录树的拼接AND、Or、Not 表达式目录树的拼接AND、Or、Not 1.利用ExpressionVisitor统一参数 2. 合并表达式 expr1 AND expr2 3. 合并表达式 expr1 or expr2 4.Not 1.利用ExpressionVisitor统一参数 遍历表达式类型,当遇到参数类型表达式时,替换为我们自己定义的参数。 inte...

佛陀爱老虎的博客 2258

C#表达式目录树系列之3 -- 为EF查询实现动态OrderBy

概要 在后端开发中,我们常碰到这样的需求,用户需要对数据进行排序和分页,但是基于哪个栏位排序不确定,需要根据用户在页面上的操作动态获取,并且可能有一个或多个栏位参与排序。 对于此类需求的一般做法是,前端根据用户的输入生成一个对应的URL,包括分页数据和排序数据。例如: https://xxxx/students?pagestart=1&pagelength=10&orderby=Department desc,Name 对于后端,通过URL地址,获取分页和排序信息,需要使用EF的排序。我们想

weixin_43263355的博客 2248

(转)LINQ to Entities 多条件动态查询

原文地址:http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspxSomeone asked a great question on the ADO.NET Entity Framework forums yesterday: how do I compose p...

weixin_30236595的博客 177

C# Expression表达式树的And、Or逻辑运算(可用于Lambda表达式之前先动态拼接查询条件)

C# Expression表达式树的And、Or逻辑运算(可用于Lambda表达式构建条件) PredicateBuilder类(linq多条件组合查询) PredicateBuilder类如下: public static class PredicateBuilder { /// <summary> /// 机关函...

carcarrot的博客 8335

linq 动态排序 order by

linq 动态排序,使用System.Linq.Dynamic

zhenzhang234的专栏 1万+
上一篇: [Practice Note] Net Redis操作实现
下一篇: Net中 .DIstinct方法无法去重问题
Gen??
博客等级 码龄7年 24粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值