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命令树结构,根据一定的算法查询数据库数据,最后将查询到的数据放在此集合中。                 

  • 相关阅读:
    vue nextTick使用
    Vue slot插槽内容分发
    vue 项目设置实现通过本地手机访问
    vue router mode模式在webpack 打包上线问题
    html设置 hight100%问题
    更新模块通知栏显看不到当前进度,以及更新下载中可以清理通知问题,华为强制更新退出软件后台下载不显示通知问题
    ScrollView下嵌套GridView或ListView默认不在顶部的解决方法
    文件说明注释
    EditText双光标问题
    原 android重启应用(应用重新启动自身)
  • 原文地址:https://www.cnblogs.com/chay1227/p/2860900.html
Copyright © 2011-2022 走看看