[MSDN]C# 3.0 锐利体验系列课程 之五 查询表达式LINQ (3)

 C# 3.0 锐利体验系列课程(5):
查询表达式LINQ (3)
李建忠
jianzhong.lee@gmail.com
祝成科技高级培训讲师
www.softcompass.com

Linq查询执行过程
Table<Product> Products = db.GetTable<Product>();
var result =from c in Products
where c.Price>500
select c;
foreach(Product p in result){
…….
}
注意,result变量仅仅是对Linq查询的一个描述,而非执行结
果。换言之,Linq查询语句并不立即执行得到结果,而是将
查询缓存在变量result中。
那么result 的类型是什么呢?IQueryable<Product>

IQueryable<T>类型
namespace System.Linq {
public interface IQueryable : IEnumerable {
Type ElementType { get; }
Expression Expression { get; }
IQueryable CreateQuery(Expression expression);
object Execute(Expression expression);
}
public interface IQueryable<T> : IEnumerable<T>,
IQueryable, IEnumerable {
IQueryable<TElement> CreateQuery<TElement>(Expression exp);
TResult Execute<TResult>(Expression exp);
}
}

Linq执行与IQueryable<T> 接口
var result =from c in Products
where c.Price>500
select c;
foreach(Product p in result){
…….
}
IQueryable<T> 只是查询表示,类似于SqlCommand等命令表
示,真正的查询执行要依赖于在其上的调用操作。只不过
SqlCommand表达查询的是一个查询字符串,而
IQueryable<T> 表达查询的是一个Expression强类型数据结构。
foreach语句会导致IQueryable<T> 上的方法GetEnumerator()
执行,从而导致查询的执行,并将返回结果IEnumerator<T>

Linq延迟执行
var result =from c in Products
where c.Price>500
select c;
foreach(Product p in result){
Console.WriteLine(p.Name);
}
foreach(Product p in result){
Console.WriteLine(p.Name);
}
因此,对于上述程序,两个foreach语句块会导致查询被执行
两次, 这种行为被称作Linq延迟执行。如果使用不当,会导
致各种程序效率问题,比如大量的数据绑定如果都做得是Linq
延迟执行,程序效率将会大大降低。

改进Linq延迟执行
var result =from c in Products
where c.Price>500
select c;
var list=result.ToList<Product>;
foreach(Product p in list){
Console.WriteLine(p.Name);
}
foreach(Product p in list){
Console.WriteLine(p.Name);
}
通过调用ToList或者ToArray方法,可以直接执行Linq查询,
将查询结果缓存在list变量中。从而可以避免Linq延迟执行的
效率问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值