博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#复习笔记(六)

Posted on 2010-04-02 02:51  SkyPurple  阅读(268)  评论(0)    收藏  举报
Linq(3):
先来例子:
Linq查询执行过程:
Table<Product> Products = db.GetTable<Product>();
var result = from c in Products where slect c;
foreach(Product p in result)
{
    .......
}
result 可以替换成IQueryable<Product> result
注意,result变量仅仅是对Linq查询的一个描述,而非执行结果.换言之,
Linq查询语句并不立即执行得到结果,而是将查询缓存在变量result中.
那么result的类型是什么呢?是IQueryable<Product>
IQueryable<T> 只是查询表示,类似于SqlCommand等命令表示,真正的
查询执行要依赖于在其上的调用操作.只不过SqlCommand表达查询的是一个
查询字符串,而IQueryable<T>表达查询的是一个Expression强类型数据结构.

foreach语句会导致IQueryable<T>上的方法GetEnumerator()执行,从而
导致查询的执行,并将返回结果IEnmerator<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表达式在定义以后,也只是一个定义,其对集合的“查询”在这个时候其实是

没有进行的,实际的动作发生在定义之后对这个定义进行操作的时候。这就是所谓的

延时执行:        
     有例为证:
Code
            List<Employee> emps = new List<Employee>()
            {
                new Employee(){ id="1001", name="ivan", dept="isd",

tel="1021"},
                new Employee(){ id="1002", name="ivan", dept="isd",

tel="1021"},
            };

            var query = from e in emps
                        select e;

            emps.Add(new Employee(){ id="1003", name="ivan", dept="isd",

tel="1021"});

            Console.WriteLine(query.Count());  

    运行一下,就可以知道,此Count为3,而不是2.
     如果想要LINQ在定义的时候就对结果进行“存储”,可以利用ToList, ToArray

等转换运算符。
Code
            var query2=from e in emps.ToList<Employee>()
                       select e;

            emps.Add(new Employee() { id = "1004", name = "ivan", dept =

"isd", tel = "1021" });

            Console.WriteLine(query2.Count());


通过调用ToList或者ToArray方法,可以直接执行Linq查询,将查询结果缓存在
list变量中.从而可以避免Linq延迟执行的效率问题.
但是, 也可以利用延迟执行这点来对程序进行适当的修改..

Linq的查询不建议直接绑定控件,而是ToList或者ToArray之后绑定....