ef 通过反射和表达式树配置全局过滤筛选器

1.软删除接口

1 public interface ISoftDelete
2     {
3         bool IsDeleted { get; set; }
4     }

2.实体类实现

1 public class TestDeleted:ISoftDelete
2     {
3         public int Id { get; set; }
4
5         public string Name { get; set; }
6         public bool IsDeleted { get; set; }
7
8
9     }

3.modelBuilder扩展类

 1 public static class CustomModelBuilderExtensions
 2     {
 3         public static void AddSoftDeleted(this ModelBuilder builder)
 4         {
 5             var entityTypes = builder.Model.GetEntityTypes().Where(e => typeof(ISoftDelete).IsAssignableFrom(e.ClrType));
 6             foreach (var entityType in entityTypes)
 7             {
 8                 var parameter = Expression.Parameter(entityType.ClrType);
 9
10                 var propertyMethodInfo = typeof(EF).GetMethod("Property").MakeGenericMethod(typeof(bool));
11
12                 var isDeletedProperty = Expression.Call(propertyMethodInfo, parameter, Expression.Constant("IsDeleted"));
13
14                 BinaryExpression compareExpression = Expression.MakeBinary(ExpressionType.Equal, isDeletedProperty, Expression.Constant(false));
15
16                 var lambdaExpression = Expression.Lambda(compareExpression, parameter);
17
18                 builder.Entity(entityType.ClrType).HasQueryFilter(lambdaExpression);
19             }
20         }
21     }

4.迁移数据库

5.在OnModelCreating方法中使用全局筛选方法

1 builder.AddSoftDeleted();

原文地址:https://www.cnblogs.com/Spinoza/p/11831205.html

时间: 2024-08-05 13:11:20

ef 通过反射和表达式树配置全局过滤筛选器的相关文章

易宝典文章——玩转Office 365中的Exchange Online服务 之二十四 配置垃圾邮件筛选器反垃圾邮件

如果希望实现基于发件人邮件地址,或者需要拒绝某个域的邮件,可以通过Exchange Online提供的垃圾邮件筛选器策略来解决.垃圾邮件筛选器策略除了能够实现上述的黑名单筛选外,还支持白名单筛选,基于国别来进行筛选,比如阻止某岛国语言的邮件,从某小人国发来的邮件等.此外,垃圾邮件筛选器策略还定义做针对不同级别的垃圾邮件如何进行处理,是标注,还是放入垃圾箱,或者是进行隔离等.一.了解默认的垃圾邮件筛选器策略在EAC中,导航到"保护",定位到"垃圾邮件筛选器"选项卡,选

c#反射优化 表达式树

public static class FastRefelect { static Type pType; static object cmp; static Type mO; static Type mT; static Type mType; static MethodInfo m; static int i = 0; static int k = 0; public static Func<T, MethodInfo, object, object> GetSetDelegate<

委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底

本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function<T>(T a, T b); 实现泛型委托的主体代码,并调用: public static string Add(string a, string b) { return string.Format("{0} #### {1}",a,b); } //实名委托方式 Function&

使用表达式树和反射来访问对象属性的性能比较

今天在工作上遇到这么个需求:需要获取对象上所有属性的值,但并事先并不知道对象的类型. 我的第一反应就是使用反射,但是这个操作会进行多次,大量的反射肯定会有性能影响.虽然对我这个项目无关紧要,但我还是选择了另外一种解决方案:构建表达式树,再生成委托,然后将委托缓存在字典里.代码如下: 首先构建表达式树(类似这种形式:'(a) => a.xx'),并生成委托: private static Delegate BuildDynamicGetPropertyValueDelegate(PropertyI

[转] 利用表达式树构建委托改善反射性能

最近搞一个系统时由于在比较关键地方用到反射了,所以要关注了一下反射的性能问题.搜索一下,不难搜到老赵的这篇文章,下面是一些杂乱的笔记.(建议先看老赵的文章) .Net4.0反射性能改善 看老赵的文章,老赵得到的结果是这样的: 1 00:00:00.0125539 (Directly invoke) 2 00:00:04.5349626 (Reflection invoke) 3 00:00:00.0322555 (Dynamic executor) 而我把代码搞下来自己运行得到这样的结果: 1

C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Linq.Expressions; namespace INPEXOne.LearnCS { class RefletLambdaDelegate { static object[] para

用lambda表达式树优化反射

本节重点不讲反射机制,而是讲lambda表达式树来替代反射中常用的获取属性和方法,来达到相同的效果但却比反射高效. 每个人都知道,用反射调用一个方法或者对属性执行SetValue和GetValue操作的时候都会比直接调用慢很多,这其中设计到CLR中内部的处理,不做深究.然而,我们在某些情况下又无法不使用反射,比如:在一个ORM框架中,你要将一个DataRow转化为一个对象,但你又不清楚该对象有什么属性,这时候你就需要写一个通用的泛型方法来处理,以下代码写得有点恶心,但不妨碍理解意思: //将Da

根据表达式树动态生成Lambda表达式

1.准备 环境:Asp.Net MVC5 .EF6 前置知识:反射.使用过EF编写过Lambda表达式 2.基础类库 2.1该高级条件的类型 1 /// <summary> 2 /// 当前条件所属类型 3 /// </summary> 4 public enum Em_AS_ConditionType 5 { 6 /// <summary> 7 /// 并 8 /// </summary> 9 [Description("并")] 10

[.net 面向对象程序设计进阶] (5) Lamda表达式(二) 表达式树快速入门

[.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习表达式在程序设计中的优点:比如构造动态查询.动态构造表达式树完成未知对象属性访问,比反射的性能高出很多.我们可以说表达式树才是Lambda的精髓,是我们必须要熟练掌握并灵活运用的. 1.关于表达式树(Expression Tree) 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如