关于数据是否使用延迟加载,这里我不评判好或不好。主要还是要看自己系统的业务,
- 若是显示指定要加载的关联数据,可以一次性奖所有需要数据全部取出,这样就能避免延迟加载而导致的与数据源进行多次交互带来的性能问题。
- 若暂时不需要该数据,或是不确定是否需要改数据,可以使用延迟加载。当确定需要后在加载它。延迟加载是一种很重要的数据访问特性,可以有效地减少与数据源的交互。从而提升程序性能。
但是滥用延迟加载就可能会不但不能提升软件性能,反而会适得其反。
根据以上的两种情况,我们在底层方法抽象时就需要考虑,该使用哪种方式进行封装,那种方法支持延迟,哪些是全文索引。
下面我们就列举一个示例
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
小结:
不正确的查询就会造成数据库全表查询,滥用延迟加载反而造成效率更慢。应该根据具体的业务情况综合只用。不可单独的说某一方好。