zoukankan      html  css  js  c++  java
  • Linq/Lambda表达式(离线型集合与内存型集合区别)

    1. 查询

    Linq:

    var result = from u in UserInfo

                       where u.ID>2

                       select u;

    Lambda:

    var result = UserInfo.where<UserInfo>(u=>u.ID>2);

    2. 查询部分列,用到匿名类

    Linq:

    var result = from u in UserInfo

                       where u.ID>2

            select new {u.ID,u.Name};

    Lambda:

    var result = UserInfo.where<UserInfo>(u=>u.ID>2).

                        select(u=>new {u.ID,u.Name});

    3. 排序

    Linq:

    var result = from u in UserInfo

                   where u.ID>2

            order by u.ID;

    Lambda:

    var result = UserInfo.where<UserInfo>(u=>u.ID>2).

                      // OrderBy<UserInfo,int>(u=>u.ID).

                       OrderByDecending<UserInfo,int>(u=>u.ID);

    4. 分页

    Linq:

    var result = (from u in UserInfo orderby u.ID  select u).

                        Skip(5).

                        Take(5);

                       

    Lambda:

    var result = UserInfo.where<UserInfo>(u=>u.ID>2).

                        OrderBy<UserInfo,int>(u=>u.ID).

                        Skip<UserInfo>(5).

                        Take<UserInfo>(5);

    5.左外连接:可以的连接有Join 和 GroupJoin 方法。GroupJoin组联接等效于左外部联接,它返回第一个(左侧)数据源的每个元素(即使其他数据源中没有关联元素)。

    var result = from d in edm.Order_Details

                       join order in edm.Orders

                       on d.OrderID equals order.OrderID

                       select new 

            {

                            OrderId = order.OrderID,

                            ProductId = d.ProductID,

                            UnitPrice = d.UnitPrice

                       };

    -------------------------

    var 最终类型都是IQueryable<UserInfo>类型,是离线型集合,每次用到这个集合才到数据库中查,当然用到多次也就要查询多次。

    例如下面两个foreach循环,用到result集合才会去查询数据库,并且两次foreach,就去数据库查询两次,这就是延迟加载机制:

    foreach(var userinfo in result)

    {

    }

    foreach(var userinfo in result)

    {

    }

    --怎么避免延迟加载机制多次查询数据库的问题??

    答:使用内存型的集合。List、Array、IEnumable

    var result = UserInfo.where<UserInfo>(u=>u.ID>2).

                        OrderBy<UserInfo,int>(u=>u.ID).

                        Skip<UserInfo>(5).

                        Take<UserInfo>(5).

                        ToList(); //在使用到此集合时,只需要查询数据库一次,就将数据放到本地内存集合中,以后再用到,就到本地内存中取。

    ----------------

    IQueryable接口与IEnumberable区别:

    从例子中分析:

    var temp = demoEntities.Product

                    .Where<Product>(p => p.ProductId > 0)

                    .OrderBy(p => p.ProductId)

                    .Skip<Product>(3 * 2)

                    .Take<Product>(3)

                    .Select(p => new { p.ProductId,p.ProductName });

    IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了, 

    而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令。也是延迟到我要真正显示数据的时候才执行。

    ---------------------------

    namespace System.Linq

    {

      public interface IQueryable : IEnumerable

          {

        Expression Expression {get;}

        Type ElementType {get;}

        IQueryProvider Provider {get;}

          }

    }

     IQueryable继承IEnumerable接口,故可实现foreach遍历。当程序中要使用IQueryable集合中的数据时,IQueryProvider会将Expression翻译成为sql命令树结构,根据一定的算法查询数据库数据,最后将查询到的数据放在此集合中。                 

  • 相关阅读:
    [JS]手写动画最小时间间隔设置
    [CSS3]chrome浏览器中支持汉字的最小像素是12px,如何让显示更小的字体
    [HTML,CSS]div+css垂直水平居中
    promise经典题目
    HTML5新兴API
    使用MessageChannel(消息通道)进行深拷贝
    原生js手写Promise
    github图片显示不出来-已解决
    前端原生js加密解密
    vue-cli3前端工程静态文件下载
  • 原文地址:https://www.cnblogs.com/chay1227/p/2860900.html
Copyright © 2011-2022 走看看