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之后绑定....
先来例子:
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之后绑定....
浙公网安备 33010602011771号