一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

LINQ語句中的.AsEnumerable() 和 .AsQueryable()的區(qū)別(轉)

 zww_blog 2017-02-02

在寫LINQ語句的時候,往往會看到.AsEnumerable() 和 .AsQueryable() 。
例如:

1.
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"]; //創(chuàng)建表
var dslp = from d in tables.AsEnumerable() select d;//執(zhí)行LINQ語句,這里的.AsEnumerable()是延遲發(fā)生,不會立即執(zhí)行,實際上什么都沒有發(fā)生
foreach(var res in dslp)
{
Response.Write(res.Field
<string>("Cname").ToString());
}

       上述代碼使用LINQ 針對數(shù)據(jù)集中的數(shù)據(jù)進行篩選和整理,同樣能夠以一種面向對象的思想進行數(shù)據(jù)集中數(shù)據(jù)的篩選。在使用LINQ 進行數(shù)據(jù)集操作時,LINQ 不能直接從數(shù)據(jù)集對象中查詢,因為數(shù)據(jù)集對象不支持LINQ 查詢,所以需要使用AsEnumerable 方法返回一個泛型的對象以支持LINQ 的查詢操作。

.AsEnumerable()是延遲執(zhí)行的,實際上什么都沒有發(fā)生,當真正使用對象的時候(例如調用:First, Single, ToList....的時候)才執(zhí)行。
下面就是.AsEnumerable()與相對應的.AsQueryable()的區(qū)別:
AsEnumerable將一個序列向上轉換為一個IEnumerable, 強制將Enumerable類下面的查詢操作符綁定到后續(xù)的子查詢當中。
AsQueryable將一個序列向下轉換為一個IQueryable, 它生成了一個本地查詢的IQueryable包裝。

  • .AsEnumerable()延遲執(zhí)行,不會立即執(zhí)行。當你調用.AsEnumerable()的時候,實際上什么都沒有發(fā)生。
  • .ToList()立即執(zhí)行
  • 當你需要操作結果的時候,用.ToList(),否則,如果僅僅是用來查詢不需要進一步使用結果集,并可以延遲執(zhí)行,就用.AsEnumerable()/IEnumerable /IQueryable
  • .AsEnumerable()雖然延遲執(zhí)行,但還是訪問數(shù)據(jù)庫,而.ToList()直接取得結果放在內存中。比如我們需要顯示兩個部門的員工時,部門可以先取出放置在List中,然后再依次取出各個部門的員工,這時訪問的效率要高一些,因為不需要每次都訪問數(shù)據(jù)庫去取出部門。
  • IQueryable實現(xiàn)了IEnumberable接口。但IEnumerable<T> 換成IQueryable<T>后速度提高很多。原因:
  • IQueryable接口與IEnumberable接口的區(qū)別:  IEnumerable<T> 泛型類在調用自己的SKip 和 Take 等擴展方法之前數(shù)據(jù)就已經(jīng)加載在本地內存里了,而IQueryable<T> 是將Skip ,take 這些方法表達式翻譯成T-SQL語句之后再向SQL服務器發(fā)送命令,它并不是把所有數(shù)據(jù)都加載到內存里來才進行條件過濾。
  • IEnumerable跑的是Linq to Object,強制從數(shù)據(jù)庫中讀取所有數(shù)據(jù)到內存先。
  • 2、AsEnumerable和AsQueryable的實例

     
    實例一
     
     
    C# 代碼   復制
    
    using (testContext context = new testContext())
    {
        var query = (from item in context.Users.AsQueryable()
                        where item.id > 10
                        select item.id).ToList();
        var query2 = (from item in context.Users.AsEnumerable()
                        where item.id > 10
                        select item.id).ToList();
    }
    

    服務器端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())
    {
        var query = (from item in context.Users.AsQueryable()
                        where item.id > 10
                        orderby item.id ascending
                        select item.id).Skip(20).Take(20).ToList();
        var query2 = (from item in context.Users.AsEnumerable()
                        where item.id > 10
                        orderby item.id ascending
                        select item.id).Skip(20).Take(20).ToList();
    }
    

     

    服務器端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]

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    情一色一区二区三区四| 搡老妇女老熟女一区二区| 久久婷婷综合色拍亚洲| 国产水滴盗摄一区二区| 青青操成人免费在线视频| 嫩呦国产一区二区三区av| 免费播放一区二区三区四区| 日韩一区二区三区在线日| 老鸭窝老鸭窝一区二区| 草草视频福利在线观看| 国产免费自拍黄片免费看| 亚洲中文字幕在线观看四区| 国内九一激情白浆发布| 日本成人中文字幕一区| 国产精品推荐在线一区| 99久久精品久久免费| 国产又粗又长又大高潮视频| 大胆裸体写真一区二区| 国产伦精品一区二区三区精品视频| 精品香蕉一区二区在线| 国产精品夜色一区二区三区不卡 | 日本高清中文精品在线不卡| 欧美国产日韩在线综合| 欧美国产日产在线观看| 少妇淫真视频一区二区| 高清一区二区三区大伊香蕉| 国产精品视频一区二区秋霞| 亚洲国产成人精品一区刚刚| 午夜国产成人福利视频| a久久天堂国产毛片精品| 国产精品国产亚洲看不卡| 好东西一起分享老鸭窝| 日韩黄色大片免费在线| 中国黄色色片色哟哟哟哟哟哟| 亚洲av熟女一区二区三区蜜桃| 国产成人精品视频一二区| 国产成人午夜av一区二区| 免费亚洲黄色在线观看| 国产一区欧美一区二区| 亚洲熟女诱惑一区二区| 午夜精品黄片在线播放|