由于MS仅授权本人在博客园上发布Intruducing Microsoft LINQ的前两章内容,故其余部分译稿不再发布.接下来的部分将小弟将以自己的理解来继续介绍LINQ基础。

  好在前三章的内容已经为我们学习LINQ打好了基础,相信我们接下来的学习也不会出现多大的障碍。

  在进行本节之前,我们先进行一下准备工作:建立一个Customer类,基础部分的讲解均以此类为基础:

类定义如下:

LINQ基础(一)LINQ基础(一)Customer Class
LINQ基础(一)public class Customer
LINQ基础(一)LINQ基础(一)    
LINQ基础(一){
LINQ基础(一)        
LINQ基础(一)LINQ基础(一)        
automatic properties#region automatic properties
LINQ基础(一)LINQ基础(一)        
/**//// <summary>
LINQ基础(一)        
/// name of  the customer
LINQ基础(一)        
/// </summary>

LINQ基础(一)LINQ基础(一)        public string Name LINQ基础(一)getset; }
LINQ基础(一)LINQ基础(一)        
/**//// <summary>
LINQ基础(一)        
/// address of  the customer
LINQ基础(一)        
/// </summary>

LINQ基础(一)LINQ基础(一)        public City Address LINQ基础(一)getset; }
LINQ基础(一)
LINQ基础(一)LINQ基础(一)        
/**//// <summary>
LINQ基础(一)        
/// the 
LINQ基础(一)        
/// </summary>

LINQ基础(一)LINQ基础(一)        public Order[] Orders LINQ基础(一)getset; }
LINQ基础(一)        
#endregion

LINQ基础(一)
LINQ基础(一)        
//cuz we should make sure Age is between 20 and 100,we could no longer use automatic property 
LINQ基础(一)LINQ基础(一)
        /**//// <summary>
LINQ基础(一)        
/// age of the customer
LINQ基础(一)        
/// </summary>

LINQ基础(一)        private int _age;
LINQ基础(一)LINQ基础(一)        
public int Age LINQ基础(一){
LINQ基础(一)LINQ基础(一)            
get LINQ基础(一){
LINQ基础(一)                
return _age;
LINQ基础(一)            }

LINQ基础(一)LINQ基础(一)            
set LINQ基础(一){
LINQ基础(一)                
if (value >=20 && value <=100)
LINQ基础(一)LINQ基础(一)                
LINQ基础(一){
LINQ基础(一)                    _age 
= value;
LINQ基础(一)                }

LINQ基础(一)                
else
LINQ基础(一)LINQ基础(一)                
LINQ基础(一){
LINQ基础(一)                    Console.WriteLine(
"age invalid");
LINQ基础(一)                    Console.WriteLine(
"Press Enter key to continue..");
LINQ基础(一)                    Console.Read();
LINQ基础(一)                   
// throw new Exception("age invalid");
LINQ基础(一)
                }

LINQ基础(一)            }

LINQ基础(一)        }

LINQ基础(一)    }

辅助此类的还有一枚举City,定义如下:

LINQ基础(一)LINQ基础(一)City
LINQ基础(一)LINQ基础(一) /**//// <summary>
LINQ基础(一)    
/// cities
LINQ基础(一)    
/// </summary>

LINQ基础(一)    public enum City
LINQ基础(一)LINQ基础(一)    
LINQ基础(一){
LINQ基础(一)        Beijing
=0,
LINQ基础(一)        Heze
=1,
LINQ基础(一)        Harbin
=3,
LINQ基础(一)        Shanghai
=4,
LINQ基础(一)        Nanyang
=5,
LINQ基础(一)        Kunming
=6
LINQ基础(一)    }

万事俱备,东风开吹:

一,最基础的from...in...select

这是LINQ查询中最基本的语句,其中包括三个关键字,我们看到和SQL语句中的select * from …很像吧(只不过是顺序上反了过来),的确是类似,可是意义却相差千里,T-SQL中是用于对数据表进行查询,而LINQ的这个奠基from..in..select却是不仅仅是可以进行一种查询,可以对任何实现了IEnumerable<T>的类进行查询,很激动人心?

假如我们实例化了一个Customer数组,如下:

LINQ基础(一)LINQ基础(一)Customer Array
LINQ基础(一)//init Customer array 
LINQ基础(一)

LINQ基础(一)LINQ基础(一)Customer[] customers 
= new Customer[]LINQ基础(一)
LINQ基础(一)
LINQ基础(一)LINQ基础(一)
new CustomerLINQ基础(一){ Name="Xianlong", Age=21, Address= City.Heze}
LINQ基础(一)
LINQ基础(一)LINQ基础(一)
new CustomerLINQ基础(一){ Name="Mujie", Age=23, Address= City.Kunming}
LINQ基础(一)
LINQ基础(一)LINQ基础(一)
new CustomerLINQ基础(一){ Name="Baoxu", Age=25, Address= City.Nanyang}
LINQ基础(一)
LINQ基础(一)LINQ基础(一)
new CustomerLINQ基础(一){ Name="Yanyan", Age=23, Address= City.Heze}
LINQ基础(一)
LINQ基础(一)LINQ基础(一)
new CustomerLINQ基础(一){ Name="Anonymous", Age=35, Address= City.Beijing}
LINQ基础(一)
LINQ基础(一)}

LINQ基础(一)

那么我们就可以对该数组进行查询:

 

LINQ基础(一)LINQ基础(一)Search
LINQ基础(一)IEnumerable<Customer> HezeCustomers = 
LINQ基础(一)
LINQ基础(一)from c 
in customers 
LINQ基础(一)
LINQ基础(一)select c; 
LINQ基础(一)

from来决定查询实施的目标,该目标的类必须实现了IEnumerable<T>的接口.查询结果的类型是由select来决定的,此处我们是select c,而c在此处代表的是customers,所以此查询的返回的是customer对象集合,如果我们select c.Name,那么返回的就是所有customer的name字符串组成的集合,此时相应的IEnumerable<Customer>也应修改为IEnumerable<string>.

由于此查询没有任何的限制条件,帮结果集是将数组中的所有元素均查了出来,然后我们就可以通过遍历HezeCustomers取出其中的数据来:

LINQ基础(一)LINQ基础(一)Iterate the resultset
LINQ基础(一)foreach (var item in HezeCustomers) 
LINQ基础(一)
LINQ基础(一)LINQ基础(一)
LINQ基础(一)
LINQ基础(一)
LINQ基础(一)Console.WriteLine(
"name=" + item.Name); 
LINQ基础(一)
LINQ基础(一)Console.WriteLine(
"Age=" + item.Age); 
LINQ基础(一)
LINQ基础(一)Console.WriteLine(
"Address=" + item.Address); 
LINQ基础(一)
LINQ基础(一)Console.WriteLine(
"========================================================"); 
LINQ基础(一)
LINQ基础(一)}
 
LINQ基础(一)
LINQ基础(一)

注意到我们遍历时的var关键字了吗?这是C#3.0中新增的关键字之一(相关知识:本地类型推断),如果你不认识它的话,建议你通过阅读我前面的译文对它的身世进行了解.

此时输出结果如下

LINQ基础(一)

二、对查询结果进行筛选和排序

仅限于将数据查询出来还远不能满足我们的需求,那么,我们就要寻找能够满足我们需求的方法来达到我们的目的(目的很纯洁,不是不可告人哦).LINQ中的Where和OrderBy关键字正好为我们提供了这种支持.还是上面的查询为例,假使我们需要查出Address为Heze的customer,并且将结果以Age倒序排列,就像在SQL语句中那样,我们自然要想到用Where来进行过滤,以desc或者某个关键字标识排列是顺序还是倒序,ok,既然想到了这一点那就不妨一试:

LINQ基础(一)LINQ基础(一)Filter and sort
LINQ基础(一)IEnumerable<Customer> HezeCustomers = 
LINQ基础(一)
LINQ基础(一)from c 
in customers 
LINQ基础(一)
LINQ基础(一)
where c.Address == City.Heze 
LINQ基础(一)
LINQ基础(一)orderby c.Age descending 
LINQ基础(一)
LINQ基础(一)select c; 
LINQ基础(一)

  遍历结果集,正是我们所需要的所有地址为”Heze”的客户记录,并且其集合中的元素是Age倒序排列,如果不加descending关键字会如何?聪明的你肯定已经知道了,当然是正序排了呗,正序排列的关键字是ascending。 如果想使用多个排序条件的话,仅再增加

我们知道在C#3.0中引入了lambda表达式(=>)和扩展方法(extention method),既然引入了,我们就可以使用,其实在上面的查询语方式中已经使用到了,下面我们就将上面的查询表达式拆解一下。像上面的c=>c.Address== City.Hezeorder by c.Age之类的表达式,其实是对它们的应用的一种,对其的详细解释,请查看我前段时间发布的译稿 .鉴于此,我们用如下的代码去实现上面的功能:

LINQ基础(一)LINQ基础(一)Code
LINQ基础(一)Func<Customer, bool> filter = d => d.Address == City.Heze; 
LINQ基础(一)
LINQ基础(一)Func
<Customer, Customer> selection = c => c; 
LINQ基础(一)
LINQ基础(一)Func
<Customer, int> orderby = c => c.Age; 
LINQ基础(一)
LINQ基础(一)IEnumerable
<Customer> HezeCustomers = 
LINQ基础(一)
LINQ基础(一)customers 
LINQ基础(一)
LINQ基础(一).Where(filter) 
LINQ基础(一)
LINQ基础(一).OrderByDescending(orderby) 
LINQ基础(一)
LINQ基础(一).Select(selection); 
LINQ基础(一)
LINQ基础(一)

三、基于基本查询的扩展思考

不知道兄弟们在学习语言的时候是什么情形,就我自己而言,习惯于在学习到一种功能之后去思考这种功能能否扩展,然后根据自己的思考去查询相关的资料。同样,在这里,我们刚才使用的是一个简单的customer对象类,使用的是最简单的字段。那么我们可不可以考虑一下对该类进行扩展,然后对扩展的类也实行同样的功能?比如我们再加一个字段Projects,该Projects为Project对象的数组,然后对再对该Projects字段进行一些相应的操作是否可以?答案是肯定的,因为凡是我们想到的功能,MS的工程师们也能想到。限于篇幅,这里就不再讲解。可以自行尝试或者查看源码中的事例。

源码下载(VS2008 正式版下运行): Source Code

未完待续

转载于:https://www.cnblogs.com/hanxianlong/archive/2008/04/03/1136127.html

相关文章:

  • 2021-07-04
  • 2021-11-11
  • 2021-05-29
  • 2022-03-01
  • 2022-01-04
  • 2022-02-08
  • 2022-02-25
  • 2021-07-05
猜你喜欢
  • 2021-06-24
  • 2021-05-22
  • 2022-01-13
  • 2022-12-23
  • 2022-12-23
  • 2021-07-10
相关资源
相似解决方案