的区别和用法

作者: 编程技术  发布:2019-09-20

Linq中 AsQueryable(), AsEnumerable()和ToList()的区分和用法:
在写LINQ语句的时候,往往会看到AsEnumerable() ,AsQueryable() 和ToList()的用法,三者有什么分化呢?以下是本身的通晓,有疾患请大家指教!
在System.Linq命名空间下,有五个静态类:
Enumerable类,它针对持续了IEnumerable<T>接口的聚合举行扩大;
Queryable类,针对持续了IQueryable<T>接口的集中进行扩张。
一、AsQueryable():
先说说如何是 IQueryable,AsQueryable将二个体系向下退换为二个IQueryable, 它生成了七个本土查询的IQueryable包装。
1,lazy load 特性
以下是一段最常见的代码:
var products = db.Product.where(p => p.Type == "food").select(p => new { p.Id, p.Name, p.CreateTime});
只顾:Select() 的回到类型为 IQueryable,为 IQueryable<T>, 语句奉行后不会即刻查询数据库, 而是在迭代应用 products 时才会查数据库, 具备 lazy load 的本性, 按需查数据库可增加度序功能。
2,高程序成效.
迭代时上面的代码类似于上边包车型地铁 sql 语句:
select Id, Name, CreateTime from Product where Type = 'food'
对 products 再次使用数据库查询操作, 运维时会把结果合併为1条 sql 语句, 如下,
var products = db.Product.where(p => p.Type == "food").select(p => new { p.Id, p.Name, p.CreateTime});var orderedProducts = products.OrderBy(p => p.CreateTime);
迭代时生成的 sql 语句看似:
select Id, Name, CreateTime from Product where Type = 'food' order by CreateTime
IQueryable 有过多限量, 只扶助数据库查询语法, 不可能支撑 Linq to object 的操作, 是LINQ TO SQL。
结论:AsQueryable将四个行列向下更改为贰个IQueryable, 它生成了二个本地查询的IQueryable包装。二、AsEnumerable()
同等支撑 lazy load,是延迟实施的,实际上什么都不曾产生,当真正使用对象的时候(比方调用:First, Single, ToList....的时候)才施行。 但不要滥用。迭代时遇上 AsEnumerable() 会先实行 sql 查询, 可是, 千万不要为了便利而滥用 AsEnumerable(), 大概会严重消功耗源,能开展 Linq to object 操作。
eg:var products = db.Product.AsEnumerable().Select(p => new {p.Id, p.Name, p.CreateTime.Date});对IQueryable对象使用AsEnumerable()后,照旧是延迟推行,可是此时指标本质已经变了。
地点的代码在询问时会把全部Product表的结果贮存进内部存款和储蓄器, 然后举办 .Select 查询,严重消功耗源。
结论:AsEnumerable将一个队列向上转换为三个IEnumerable, 强制将Enumerable类上边包车型地铁查询操作符绑定到三番五次的子查询其中。AsEnumerable()延迟实行,不会即时施行。当你调用.AsEnumerable()的时候,实际上什么都并未有生出。注意:IQueryable完结了IEnumberable接口。但IEnumerable<T> 换到IQueryable<T>后速度提升广大。
IQueryable接口与IEnumberable接口的分别: IEnumerable<T> 泛型类在调用自个儿的SKip 和 Take 等扩张方法以前数据就已经加载在本地内部存款和储蓄器里了,而IQueryable<T> 是将Skip ,take 这么些主意表明式翻译成T-SQL语句之后再向SQL服务器发送命令,它而不是把持有数据都加载到内部存款和储蓄器里来才开展规范过滤。三、ToList()
调用 ToList() 会即刻查询并保留结果, 而不会等到迭代时才查询,功效和 lazy load 是相反的。
在急需获得完全结果后, 再管理的气象, 需求选取 ToList()。

1.简介

用Linq来操作会集的时候会用到AsQueryable()和AsEnumerable(),哪天该用AsQueryable()和曾几何时该用AsEnumerable(),或者存在些猜疑。AsQueryable是在数据库中询问再回去数据,AsEnumerable是从数据库读取全体多少再在前后相继中询问。

 

在运用LINQ 举行数据集操作时,LINQ 无法一贯从数据集对象中询问,因为数据集对象不帮衬LINQ 查询,所以需求使用AsEnumerable 方法重返二个泛型的目的以支撑LINQ 的询问操作。

例如

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)                
{
     Response.Write(res.Field<string>("Cname").ToString());
}

一、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的实例

 

实例一

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

--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]

实例二

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

--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]

 

转:

本文由贝博体育app发布于编程技术,转载请注明出处:的区别和用法

关键词:

上一篇:没有了
下一篇:没有了