博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#在泛型类中,通过表达式树构造lambda表达式
阅读量:4350 次
发布时间:2019-06-07

本文共 1542 字,大约阅读时间需要 5 分钟。

场景

最近对爬虫的数据库架构做调整,需要将数据迁移到MongoDB上去,需要重新实现一个针对MongoDB的Dao泛型类,好吧,动手开工,当实现删除操作的时候问题来了。

我们的删除操作定义如下:void Delete(TEntity entity)。TEntity是我们的泛型类。

而MongoDB官方驱动自带的删除操作是这样的:

 
123
// 假设数据模型为已定义的Articlevar query = Query
.EQ(t => t.Id, id);coll.Remove(query);

Dao操作的接口是不能修改的,这就要求我们必须实现以下操作:

  1. 获取entity的Id值
  2. 构造lambda表达式用于获取Id属性

实现

对于第1个好办,直接通过反射拿就可以了,至于第2个构造lambda表达式却不知该如何下手了。

在网上查资料了解到C# Lambda表达式树允许我们像处理数据(比如读取,修改)一样来处理Lambda表达式。。这就有方向了,研究了一下表达式树的相关知识,历经坎坷终于将其实现。

我用到的lambda表达式比较简单,也容易构造,代码中看注释应该就明白了,代码:

 
1234567891011121314151617181920212223242526272829
/// /// 因为使用的Mongodb,每个数据模型必定包含Id属性,通过Id属性来删除实体/// /// public void Delete(TEntity entity){    var coll = _db.GetCollection
(typeof(TEntity).Name); if (entity == null) { return; } ObjectId id = (ObjectId)typeof(TEntity).GetProperty("Id").GetValue(entity, null); // 通过表达式树构造lambda表达式{t => t.Id} // 构造调用目标t var target = Expression.Parameter(typeof(TEntity), "t"); // 构造对t的属性Id的表达式 MemberExpression bodyExp = Expression.Property( target, "Id"); // 构造完整的lambda表达式 Expression
> selector = Expression.Lambda
>(bodyExp, new [] { target }); // 使用泛型前的语句: Query
.EQ(t => t.Id, id); var query = Query
.EQ(selector, id); coll.Remove(query);}

参考资料

用到的工具

之前都是直接使用lambda表示,而且用的还很Happy,今天遇到的问题,让我很傻眼,基础还得巩固啊。今天也是第一次调试lambda表达式,用到了这个小工具。在项目调试过程中可以比较直观的查看编译好的lambda表达式。

安装和使用方法,请参见:

转载于:https://www.cnblogs.com/jasondan/p/3499220.html

你可能感兴趣的文章
Composite UI Application Block (CAB) 概念和术语
查看>>
ajax跨域,携带cookie
查看>>
阶段3 2.Spring_02.程序间耦合_7 分析工厂模式中的问题并改造
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_6 spring中bean的细节之三种创建Bean对象的方式
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_5 JdbcTemplate在spring的ioc中使用
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第11节 Logback日志框架介绍和SpringBoot整合实战_45、SpringBoot2.x日志讲解和Logback配置实战...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_4-05 微服务调用方式之feign 实战 订单调用商品服务...
查看>>
技术分析淘宝的超卖宝贝
查看>>
Azure云服务托管恶意软件
查看>>
crontab导致磁盘空间满问题的解决
查看>>
自定义滚动条
查看>>
APP开发手记01(app与web的困惑)
查看>>
初识前端作业1
查看>>
jpg转bmp(使用libjpeg)
查看>>
linear-gradient常用实现效果
查看>>
sql语言的一大类 DML 数据的操纵语言
查看>>
VMware黑屏解决方法
查看>>
JAVA 基础 / 第八课:面向对象 / JAVA类的方法与实例方法
查看>>
4.1 分解条件式
查看>>