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

  • 相关阅读:
    windows10下Mysql5.7安装指南
    SVN迁移Gitlab步骤
    java.lang.String中的replace方法到底替换了一个还是全部替换了。
    MongoDB升级导致启动失败
    阿里云CentOS7.3搭建多用户私有git服务器(从安装git开始)
    CentOS7.3编译安装Nginx设置开机启动
    关于使用Xshell远程连接启动tomcat导致图片不显示,报错Could not initialize class sun.awt.X11GraphicsEnvironment解决方案
    easyui报错“Cannot read poperty 'options' of undefined”问题解决方案之一
    Ubuntu18.04系统中vi键盘输入字符不匹配
    ux.form.field.TreePicker 扩展,修复火狐不能展开bug
  • 原文地址:https://www.cnblogs.com/chay1227/p/2860900.html
Copyright © 2011-2022 走看看