zoukankan      html  css  js  c++  java
  • linq中AsEnumerable和AsQueryable的区别

    本文导读:用Linq来操作集合的时候会用到AsQueryable()和AsEnumerable(),何时该用AsQueryable()和何时该用AsEnumerable(),或许存在些疑惑。AsQueryable是在数据库中查询再返回数据,AsEnumerable是从数据库读取全部数据再在程序中查询。

    在使用LINQ 进行数据集操作时,LINQ 不能直接从数据集对象中查询,因为数据集对象不支持LINQ 查询,所以需要使用AsEnumerable 方法返回一个泛型的对象以支持LINQ 的查询操作。

    例如

     
    C# 代码   复制
    
    
    
    
    string strcon = "Data Source=.\\SQLEXPRESS;Initial Catalog=Db_Example;Persist Security Info=True;User ID=sa;Password=sa";
    SqlConnection con = new SqlConnection(strcon);
    con.Open();
    string strsql = "select * from SC,Course where SC.Cno=Course.Cno";
    SqlDataAdapter da = new SqlDataAdapter(strsql,con);
    DataSet ds = new DataSet();
    da.Fill(ds, "mytable");
    DataTable tables=ds.Tables["mytable"]; //创建表
    var dslp = from d in tables.AsEnumerable() select d;//执行LINQ语句,这里的.AsEnumerable()是延迟发生,不会立即执行,实际上什么都没有发生
    foreach(var res in dslp)                
    

    一、linq中AsEnumerable和AsQueryable的区别

    1、AsEnumerable()是延迟执行的,实际上什么都没有发生,当真正使用对象的时候(例如调用:First, Single, ToList....的时候)才执行。 2、AsEnumerable将一个序列向上转换为一个IEnumerable, 强制将Enumerable类下面的查询操作符绑定到后续的子查询当中。 3、AsQueryable将一个序列向下转换为一个IQueryable, 它生成了一个本地查询的IQueryable包装。

    4、AsEnumerable()延迟执行,不会立即执行。当你调用.AsEnumerable()的时候,实际上什么都没有发生。 5、ToList()立即执行 6、当你需要操作结果的时候,用.ToList(),否则,如果仅仅是用来查询不需要进一步使用结果集,并可以延迟执行,就用.AsEnumerable()/IEnumerable /IQueryable

    7、AsEnumerable()虽然延迟执行,但还是访问数据库,而.ToList()直接取得结果放在内存中。比如我们需要显示两个部门的员工时,部门可以先取出放置在List中,然后再依次取出各个部门的员工,这时访问的效率要高一些,因为不需要每次都访问数据库去取出部门。 8、IQueryable实现了IEnumberable接口。但IEnumerable<T> 换成IQueryable<T>后速度提高很多。

    9、IQueryable接口与IEnumberable接口的区别:  IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。 10、IEnumerable跑的是Linq to Object,强制从数据库中读取所有数据到内存先。

    二、AsEnumerable和AsQueryable的实例

     
    实例一
     
     
    C# 代码   复制
    
    
    
    
    using (testContext context = new testContext())
    

    服务器端sql

     
    SQL 代码   复制
    
    
    
    
    --AsQueryable
    
    Select 
    [Extent1].[id] AS [id]
    FROM [dbo].[User] AS [Extent1]
    Where [Extent1].[id] > 10
    
    
    --AsEnumerable
    
    Select 
    [Extent1].[id] AS [id], 
    [Extent1].[usn] AS [usn], 
    [Extent1].[pwd] AS [pwd], 
    [Extent1].[created] AS [created]
    FROM [dbo].[User] AS [Extent1]
    
     实例二
     
     
    C# 代码   复制
    
    
    
    
    using (testContext context = new testContext())
    

    服务器端sql

     
    SQL 代码   复制
    
    
    
    
    --AsQueryable
    
    Select TOP (20) 
    [Filter1].[id] AS [id]
    FROM ( Select [Extent1].[id] AS [id], row_number() OVER (ORDER BY [Extent1].[id] ASC) AS [row_number]
        FROM [dbo].[User] AS [Extent1]
        Where [Extent1].[id] > 10
    )  AS [Filter1]
    Where [Filter1].[row_number] > 20
    orDER BY [Filter1].[id] ASC
    
    
    --AsEnumerable
    
    Select 
    [Extent1].[id] AS [id], 
    [Extent1].[usn] AS [usn], 
    [Extent1].[pwd] AS [pwd], 
    [Extent1].[created] AS [created]
    FROM [dbo].[User] AS [Extent1]
  • 相关阅读:
    使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)
    便携版WinSCP在命令行下同步文件夹
    ffmpeg (ffprobe)分析文件关键帧时间点
    sqlite删除数据或者表后,回收数据库文件大小
    ubuntu 20.04下 freeswitch 配合 fail2ban 防恶意访问
    ffmpeg使用nvenc编码的结论记录
    PC版跑跑卡丁车 故事模式 亚瑟传说章节 卡美洛庆典 2阶段 心灵之眼 攻略
    There was an error loading or playing the video
    Nvidia RTX Voice 启动报错修复方法
    火狐浏览器 关闭跨域限制
  • 原文地址:https://www.cnblogs.com/wdcwy/p/5184596.html
Copyright © 2011-2022 走看看