linq之延迟加载和即时加载+标准查询运算符

Posted 可乐不加冰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linq之延迟加载和即时加载+标准查询运算符相关的知识,希望对你有一定的参考价值。

延迟加载

Linq查询的执行结果是IEnumerable<T>类型,而对IEnumerable<T>,在内部,C#通过yield关键字实现迭代器达到延迟加载的目的。从而使Linq查询只是在需要的时候才会被执行。

 where

  Where方法是一个典型的延迟加载案例,在EF的框架中,where方法每次调用都在是在后续生成SQL语句时增加查询条件,EF无法确定本次查询是否已经添加结束,所以没有在方法执行的时候最终确定SQL语句,只能返回一个DbQuery对象,当用这个对象的时候,才会最终生成SQL去查询数据库  ---摘自《ASP.NET MVC 企业级实战》一书

即时加载

 聚合函数为影响延迟加载特性,将强制进行立即加载。诸如:toList(),sum(),Count(),First()

FindAll是一个典型的即时加载方法,使用FindAll方法会立即与数据库交互查询结果,并加载到内存中


Order By操作

适用场景:对查询出的语句进行排序,比如按时间排序等等。

说明:按指定表达式对集合排序;延迟,:按指定表达式对集合排序;延迟,默认是升序,加上descending表示降序,对应的扩展方法是OrderBy和OrderByDescending

1.简单形式

这个例子使用 orderby 按雇用日期对雇员进行排序:

var q = from e in db.Employees
        orderby e.HireDate
        select e;

  

说明:默认为升序

2.带条件形式

注意:Where和Order By的顺序并不重要。而在T-SQL中,Where和Order By有严格的位置限制。

var q =
    from o in db.Orders
    where o.ShipCity == "London"
    orderby o.Freight
    select o;

  

语句描述:使用where和orderby按运费进行排序。

3.降序排序

var q = 
    from p in db.Products
    orderby p.UnitPrice descending
    select p;

  

4.ThenBy

语句描述:使用复合的 orderby 对客户进行排序,进行排序:

var q =
    from c in db.Customers
    orderby c.City, c.ContactName
    select c;

  

说明:按多个表达式进行排序,例如先按City排序,当City相同时,按ContactName排序。这一句用Lambda表达式像这样写:

var q = 
    .OrderBy(c => c.City)
    .ThenBy(c => c.ContactName).ToList();

  

在T-SQL中没有ThenBy语句,其依然翻译为OrderBy,所以也可以用下面语句来表达:

var q = 
    db.Customers
    .OrderBy(c => c.ContactName)
    .OrderBy(c => c.City).ToList();

  

所要注意的是,多个OrderBy操作时,级连方式是按逆序。对于降序的,用相应的降序操作符替换即可。

var q = 
    db.Customers
    .OrderByDescending(c => c.City)
    .ThenByDescending(c => c.ContactName).ToList();

  

以上是关于linq之延迟加载和即时加载+标准查询运算符的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Mvc开发之EF延迟加载

LINQ中的First()会导致急切或延迟加载吗?

EF延迟加载

mybatis探究之延迟加载和缓存

Hibernate检索策略之延迟加载和立即加载

多线程下单例模式:懒加载(延迟加载)和即时加载