LINQ基础(一)

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

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

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

类定义如下:

Customer Class
public class Customer
{

automatic properties#region automatic properties
/**////


/// name of  the customer
///
public string Name { get; set; }
/**////
/// address of  the customer
///
public City Address { get; set; }

/**////
/// the
///
public Order[] Orders { get; set; }
#endregion

//cuz we should make sure Age is between 20 and 100,we could no longer use automatic property
/**////
/// age of the customer
///
private int _age;
public int Age {
get {
return _age;
            }
set {
if (value >=20 && value <=100)
{
                    _age = value;
                }
else
{
                    Console.WriteLine("age invalid");
                    Console.WriteLine("Press Enter key to continue..");
                    Console.Read();
// throw new Exception("age invalid");
                }
            }
        }
    }

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

City
/**////


/// cities
///
public enum City
{
        Beijing=0,
        Heze=1,
        Harbin=3,
        Shanghai=4,
        Nanyang=5,
        Kunming=6
    }

万事俱备,东风开吹:

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

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

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

Customer Array
//init Customer array

Customer[] customers = new Customer[]{

new Customer{ Name="Xianlong", Age=21, Address= City.Heze},

new Customer{ Name="Mujie", Age=23, Address= City.Kunming},

new Customer{ Name="Baoxu", Age=25, Address= City.Nanyang},

new Customer{ Name="Yanyan", Age=23, Address= City.Heze},

new Customer{ Name="Anonymous", Age=35, Address= City.Beijing},

};

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

Code
IEnumerable HezeCustomers =

from c in customers

select c;

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

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

Iterate the resultset
foreach (var item in HezeCustomers)

{

Console.WriteLine("name=" + item.Name);

Console.WriteLine("Age=" + item.Age);

Console.WriteLine("Address=" + item.Address);

Console.WriteLine("========================================================");

}

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

此时输出结果如下

clip_image002

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

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

Filter and sort
IEnumerable HezeCustomers =

from c in customers

where c.Address == City.Heze

orderby c.Age descending

select c;

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

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

Code
Func filter = d => d.Address == City.Heze;

Func selection = c => c;

Func orderby = c => c.Age;

IEnumerable HezeCustomers =

customers

.Where(filter)

.OrderByDescending(orderby)

.Select(selection);

 

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

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

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

未完待续

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值