Linq Coding-- Part Nine(IEnumerable、IQueryable、Set)
2008-10-09 21:46
281 查看
Code
public interface IQueryProvider {
IQueryable CreateQuery(Expression expression);
IQueryable<TElement> CreateQuery<TElement>(Expression expression);
object Execute(Expression expression);
TResult Execute<TResult>(Expression expression);
}
There are 2 interesting operations and their generic counterparts. The generic versions are used most of the time and they perform better because we can avoid using reflection for object instantiation. CreateQuery() does precisely what we are looking for. It takes an expression tree as argument and returns another IQueryable based on the logical definition of the tree. When the returned IQueryable is enumerated it will invoke the query provider which will then process this specific query expression.
The Execute() method now is used to actually executing your query expression. This explicit entry point – instead of just relying on IEnumerator.GetEnumerator() – allows executing ET’s which do not necessarily yield sequences of elements. (For example aggregate functions like count or sum.)
We finally have our two worlds nicely connected together. The mutability of ET and the deferred execution of IEnumerable combined to a construct that can analyze an arbitrary mutated and extended query at the last possible moment and execute an optimized query against its data source. It’s not even too hard to implement your own IQueryProvider for your own data source. Maybe I’ll cover that in a later post. This is really nice work Eric Meijer and his team has done here.
明白了以两者的区别和概念之后,下面再来以直观的代码方式看看有关于LINQ Set操作几个扩展方法
1 List<Int32> numbers = new List<Int32> { 21, 265, 236, 21, 956, 456, 456, 535, 236 };
2
3 List<Int32> numbersTwo = new List<Int32> { 21, 456, 535, 236 };
4
5 /// <summary>
6 /// 列出回序列中的非重复元素。
7 /// </summary>
8 public void Distinct()
9 {
10 IEnumerable<Int32> distinctNumbers = numbers.Distinct();
11
12 //IQueryable<Int32> distinctNumbers = numbers.AsQueryable().Distinct();
13
14 Console.WriteLine("Distinct numbers:");
15
16 foreach (Int32 number in distinctNumbers)
17 {
18 Console.WriteLine(number);
19 }
20 }
21
22 /// <summary>
23 /// 列出的序列只显示在第一个序列中的元素。
24 /// </summary>
25 public void Except()
26 {
27 IEnumerable<Int32> exceptNumbers = numbers.Except(numbersTwo);
28
29 //IQueryable<Int32> execeptNumbers = numbersTwo.AsQueryable().Except(numbers);
30
31 Console.WriteLine("Except numbers:");
32
33 foreach (Int32 number in exceptNumbers)
34 {
35 Console.WriteLine(number);
36 }
37 }
38
39 /// <summary>
40 /// 进行比较生成两个序列的交集。
41 /// </summary>
42 public void Intersect()
43 {
44 IEnumerable<Int32> intersectNumbers = numbers.Intersect(numbersTwo);
45
46 //IQueryable<Int32> intersectNumbers = numbersTwo.AsQueryable<Int32>()
47 .Intersect(numbers);
48
49 Console.WriteLine("Intersect numbers:");
50
51 foreach (Int32 number in intersectNumbers)
52 {
53 Console.WriteLine(number);
54 }
55 }
56
57 /// <summary>
58 /// 执行的联合操作。返回的序列包含两个输入序列的唯一的元素。
59 /// </summary>
60 public void Union()
61 {
62 IEnumerable<Int32> unionNumbers = numbers.Union(numbersTwo);
63
64 //IQueryable<Int32> unionNumbers = numbersTwo.AsQueryable().Union(numbers);
65
66 Console.WriteLine("Union numbers:");
67
68 foreach (Int32 number in unionNumbers)
69 {
70 Console.WriteLine(number);
71 }
72 }
73
74 /// <summary>
75 /// 连接两个序列。
76 /// </summary>
77 public void Concat()
78 {
79 IEnumerable<Int32> concatNumbers = numbers.Concat(numbersTwo);
80
81 //IQueryable<Int32> concatNumbers = numbersTwo.AsQueryable().Concat(numbers);
82
83 Console.WriteLine("Concat numbers:");
84
85 foreach (Int32 number in concatNumbers)
86 {
87 Console.WriteLine(number);
88 }
89 }
LINQ Coding 目录
More Linq Coding
public interface IQueryProvider {
IQueryable CreateQuery(Expression expression);
IQueryable<TElement> CreateQuery<TElement>(Expression expression);
object Execute(Expression expression);
TResult Execute<TResult>(Expression expression);
}
There are 2 interesting operations and their generic counterparts. The generic versions are used most of the time and they perform better because we can avoid using reflection for object instantiation. CreateQuery() does precisely what we are looking for. It takes an expression tree as argument and returns another IQueryable based on the logical definition of the tree. When the returned IQueryable is enumerated it will invoke the query provider which will then process this specific query expression.
The Execute() method now is used to actually executing your query expression. This explicit entry point – instead of just relying on IEnumerator.GetEnumerator() – allows executing ET’s which do not necessarily yield sequences of elements. (For example aggregate functions like count or sum.)
We finally have our two worlds nicely connected together. The mutability of ET and the deferred execution of IEnumerable combined to a construct that can analyze an arbitrary mutated and extended query at the last possible moment and execute an optimized query against its data source. It’s not even too hard to implement your own IQueryProvider for your own data source. Maybe I’ll cover that in a later post. This is really nice work Eric Meijer and his team has done here.
明白了以两者的区别和概念之后,下面再来以直观的代码方式看看有关于LINQ Set操作几个扩展方法
1 List<Int32> numbers = new List<Int32> { 21, 265, 236, 21, 956, 456, 456, 535, 236 };
2
3 List<Int32> numbersTwo = new List<Int32> { 21, 456, 535, 236 };
4
5 /// <summary>
6 /// 列出回序列中的非重复元素。
7 /// </summary>
8 public void Distinct()
9 {
10 IEnumerable<Int32> distinctNumbers = numbers.Distinct();
11
12 //IQueryable<Int32> distinctNumbers = numbers.AsQueryable().Distinct();
13
14 Console.WriteLine("Distinct numbers:");
15
16 foreach (Int32 number in distinctNumbers)
17 {
18 Console.WriteLine(number);
19 }
20 }
21
22 /// <summary>
23 /// 列出的序列只显示在第一个序列中的元素。
24 /// </summary>
25 public void Except()
26 {
27 IEnumerable<Int32> exceptNumbers = numbers.Except(numbersTwo);
28
29 //IQueryable<Int32> execeptNumbers = numbersTwo.AsQueryable().Except(numbers);
30
31 Console.WriteLine("Except numbers:");
32
33 foreach (Int32 number in exceptNumbers)
34 {
35 Console.WriteLine(number);
36 }
37 }
38
39 /// <summary>
40 /// 进行比较生成两个序列的交集。
41 /// </summary>
42 public void Intersect()
43 {
44 IEnumerable<Int32> intersectNumbers = numbers.Intersect(numbersTwo);
45
46 //IQueryable<Int32> intersectNumbers = numbersTwo.AsQueryable<Int32>()
47 .Intersect(numbers);
48
49 Console.WriteLine("Intersect numbers:");
50
51 foreach (Int32 number in intersectNumbers)
52 {
53 Console.WriteLine(number);
54 }
55 }
56
57 /// <summary>
58 /// 执行的联合操作。返回的序列包含两个输入序列的唯一的元素。
59 /// </summary>
60 public void Union()
61 {
62 IEnumerable<Int32> unionNumbers = numbers.Union(numbersTwo);
63
64 //IQueryable<Int32> unionNumbers = numbersTwo.AsQueryable().Union(numbers);
65
66 Console.WriteLine("Union numbers:");
67
68 foreach (Int32 number in unionNumbers)
69 {
70 Console.WriteLine(number);
71 }
72 }
73
74 /// <summary>
75 /// 连接两个序列。
76 /// </summary>
77 public void Concat()
78 {
79 IEnumerable<Int32> concatNumbers = numbers.Concat(numbersTwo);
80
81 //IQueryable<Int32> concatNumbers = numbersTwo.AsQueryable().Concat(numbers);
82
83 Console.WriteLine("Concat numbers:");
84
85 foreach (Int32 number in concatNumbers)
86 {
87 Console.WriteLine(number);
88 }
89 }
LINQ Coding 目录
More Linq Coding
相关文章推荐
- IEnumerable和IQueryable和Linq的查询
- 不继承 IEnumerable 或 IQueryable 的类型怎么使用 LINQ 查询
- 不继承 IEnumerable 或 IQueryable 的类型怎么使用 LINQ 查询
- Linq查询IEnumerable与IQueryable
- 关于Linq的ToList(),IEnumerable,IQueryable
- *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<WKWebViewConfiguration 0x1701bcd20> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the k
- How to convert a simple DLINQ Query to a data set object
- 如何创建自己的Linq provider (实现IQueryable)(翻译)
- 在客户端获得linq to sql 的changeset
- LinQ Coding -- (3)[Let子句]
- 浅析IEnumerable 和 IQueryable
- LINQ entityset 不包含GetEnumerator的定义,在MVC中使用entity framework(EF)出现“必须添加对程序集“System.Data.Entity”解决方法
- 深入理解IEnumerable和IQueryable两接口的区别
- 报错:setValue:forUndefinedKey:]: this class is not key value coding
- Linq与where实现查询(Linq to Entity)【IEnumerable与IEnumerator与IList】|自己实现foreach的功能
- iOS- 报错(崩)[< > setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key
- Linq101-Set
- DVD-Video 解谜 - Virtual Machine coding - Instruction Set Summary
- IEnumerable和 IQueryable 转化为DataTable