c# – 为什么Func <>和Expression>可互换?为什么一个
发布时间:2020-12-15 03:43:08 所属栏目:百科 来源:网络整理
导读:我有一个数据访问类,花了我一段时间才能开始工作.对于我的应用程序,我需要获得不同类型的SQL Server表,其中WHERE子句仅因列名而不同:某些列是read_time,其他列是ReadTime,其他列是LastModifiedTime.所以我想我会传入WHERE子句,所以我不需要为50个不同的表创
我有一个数据访问类,花了我一段时间才能开始工作.对于我的应用程序,我需要获得不同类型的SQL Server表,其中WHERE子句仅因列名而不同:某些列是read_time,其他列是ReadTime,其他列是LastModifiedTime.所以我想我会传入WHERE子句,所以我不需要为50个不同的表创建一个新方法.它看起来很简单,而且有效,但我不明白.
该方法具有表达式<>作为参数,工作原理: internal List<T> GetObjectsGreaterThanReadTime<T>(Expression<Func<T,bool>> whereClause) where T : class { Table<T> table = this.Database.GetTable<T>(); IEnumerable<T> objects = table.Where(whereClause); return objects.ToList(); } 现在,我正在尝试这种方式(下面)一段时间,它只会挂在最后一行(ToList()).首先,为什么要编译?我的意思是,为什么Expression和Func可以互换使用作为参数?那么,为什么Expression工作,而Func版本只是挂起? 注意:上述方法与此方法之间的唯一区别是方法参数(Expression vs. Func). internal List<T> GetObjectsGreaterThanReadTime<T>(Func<T,bool> whereClause) where T : class { Table<T> table = this.Database.GetTable<T>(); IEnumerable<T> objects = table.Where(whereClause); return objects.ToList(); } 解决方法
Expression版本调用
Queryable.Where ,它生成一个表达式树(当由ToList枚举时)被转换为sql并在数据库服务器上执行.据推测,数据库服务器将利用基于过滤条件的索引,以避免读取整个表.
Func版本调用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |