标签:内存
关于数据是否使用延迟加载,这里我不评判好或不好。主要还是要看自己系统的业务,
但是滥用延迟加载就可能会不但不能提升软件性能,反而会适得其反。
根据以上的两种情况,我们在底层方法抽象时就需要考虑,该使用哪种方式进行封装,那种方法支持延迟,哪些是全文索引。
下面我们就列举一个示例
Func<T, TResult>委托与 Expression<TDelegate>
这两个有什么区别,如何使用呢
以前写过一个对Func<T,Tresult>的介绍,是一个委托。这个就不多解释了
Expression<TDelegate>
类型参数
TDelegate
Expression<TDelegate> 表示的委托的类型。可以是Func<T,Tresult>
Expression<TDelegate>被称为表达式树。以表达式目录树的形式将强类型lambda 表达式表示为数据结构。 此类不能被继承。 <http://msdn.microsoft.com/zh-cn/library/system.linq.expressions(v=vs.110).aspx>
Func<T,Tresult>本身就是一个委托。而 Expression<TDelegate>确是一个表达式,只有在编译之后才会变成委托。在底层使用中,到底如何区分呢。其实如果我们写成Func<T,Tresult>类型,作为参数传递给Where方法进行Linq查询时。将会产生全表查询,将整个数据库表中的数据加载到内存中。然后再到内存中根据where中的条件进一步查询。
而Expression<Func<t,bool>>只是查询出来你where条件中的数据,不用去进行全表查询。
所以我们将原先的
IQueryable<T>LoadPageEntities<S>(int pageIndex, int pageSize, out int total,Func<T, bool> whereLambda, boolisAsc, Func<T, S> orderByLambda);
修改为
IQueryable<T>LoadPageEntities<S>(int pageIndex, int pageSize, out int total,Expression<Func<T, bool>> whereLambda, bool isAsc,Expression<Func<T, S>> orderByLambda);
下面的代码示例演示如何将 lambda 表达式表示为委托形式的可执行代码和表达式目录树形式的数据
// Lambda expressionas executable code. Func<int, bool> deleg = i => i< 5; // Invoke the delegate and display theoutput. Console.WriteLine("deleg(4) ={0}", deleg(4)); // Lambda expression as data in the form ofan expression tree. System.Linq.Expressions.Expression<Func<int, bool>> expr = i=> i < 5; Console.WriteLine("expr(4) = {0}", expr (4)); deleg(4) = True expr (4) = True
不正确的查询就会造成数据库全表查询,滥用延迟加载反而造成效率更慢。应该根据具体的业务情况综合只用。不可单独的说某一方好。
标签:内存
原文地址:http://blog.csdn.net/han_yankun2009/article/details/41823193