在.net Compact Framework 3.5中,新加入了对Linq的支持。CF中的Linq在功能是否有所删减呢?下面将详细叙述。
在.net Framework 3.5中,Linq分5个功能:
1.Linq To Objects (对对象)
2.Linq To XML (对XML)
3.Linq To Entity (对实体)
4.Linq To SQL (对Sql数据库)
5.Linq To DataSet (对数据集)
打开VS2008,创建一个SmartDevice工程。
上面的平台,我选择了Windows Mobile 5.0,我没有安装别的SDK,可以通过安装各个平台的SDK,来扩展平台选择。
在整个工程项目中,添加了几个Form,来一一做说明。
1.Linq To Objects
是指直接针对任意枚举集合使用Linq查询,如List<T>、Array等。该集合可以是用户自定义的,也可以是.net Framework API返回的集合。
Linq To Objects是一种新的处理集合的方法。在原先的处理方式中,我们必须编写检索集合的复杂的foreach等循环处理。采用Linq后,只需要描述要检索的内容的声明性代码即可。
在Form_Load事件中,在ArrayList中添加Person,然后通过Menu中的Data Bind来过滤所需要的数据。
第一个ComboBox里,添加了Person名的长度= 4的Person。
第二个ComboBox里,添加了Person名> E 的Person
代码如下:
Code
1 private void LinqToObjectForm_Load(object sender, EventArgs e)
2 {
3 lstPerson = new ArrayList();
4
5 lstPerson.Add("Peter");
6 lstPerson.Add("John");
7 lstPerson.Add("Gordon");
8 lstPerson.Add("Kevin");
9 lstPerson.Add("Robin");
10 lstPerson.Add("Dalls");
11 lstPerson.Add("Rickie");
12 lstPerson.Add("Shadow");
13 lstPerson.Add("Cindy");
14 lstPerson.Add("Eric");
15 lstPerson.Add("Jack");
16 }
17
18 private void menuItem2_Click(object sender, EventArgs e)
19 {
20 var query = from string person in lstPerson
21 where person.Length == 4
22 orderby person
23 select person;
24
25 foreach (string person in query)
26 {
27 //System.Diagnostics.Debug.WriteLine(person);
28 this.comboBox1.Items.Add(person);
29 }
30
31 query = from string person in lstPerson
32 where person.ToUpper().CompareTo("F") > 0
33 orderby person
34 select person;
35
36 foreach (string person in query)
37 {
38 this.comboBox2.Items.Add(person);
39 }
40 }
2.Linq To XML
Linq To XML是XML的一种编程方法,提供文档对象模型(DOM)的内存文档修改功能,支持Linq查询表达式。这些表达式在语法上与XPath不同,但它们可以以更加类型化的方法提供类似的功能。
Linq To XML支持对XML的创建、序列化XML、查询、修改等功呢,在此,我只做了查询XML树中符合条件的节点。
点击Menu的Data Bind,查询PurchaseOrder.xml中属性为Billing的节点,并输出到TextBox中。该xml采用微软提供的采购单的xml文档。
使用Linq To XML必须引用System.Xml.Linq命名空间。
代码如下:
Code
1 XElement root = XElement.Load(@"PurchaseOrder.xml");
2 IEnumerable<XElement> address = from el in root.Elements("Address")
3 where (string)el.Attribute("Type") == "Billing"
4 select el;
5
6 foreach (XElement el in address)
7 {
8 this.textBox1.Text += el;
9 }
3.Linq To Entity
很遗憾,在.net CF中暂不支持。
4.Linq To Sql
在Linq To Sql中,关系型数据库的数据模型映射到开发人员的实际的编程语言所表示的对象模型中。当程序运行过程中,Linq To Sql会将对象模型中的语言集成查询转换成SQL语句,然后到数据库里执行。数据库执行完毕后,返回结果,Linq To Sql会将它们再转换成编程语言所对应的对象。
Linq To Sql支持对数据库的添、删、改、查基本操作。
很遗憾,在实际开发过程中,也不支持。
5.Linq To DataSet
DataSet是使用广泛的ADO.NET组件之一,可以将查询到数据集存放到DataSet中,作为缓存数据来使用。虽然DataSet功能强大,但其查询也存在限制。Linq To DataSet可以更快更容易地查询在DataSet对象中的数据。
在Form里,点击Menu的Data Bind,在TextBox中输出的是User_Name为Gordon的那条数据。
代码如下:
Code
1 private void menuItem4_Click(object sender, EventArgs e)
2 {
3 AppDatabase1DataSet.Sys_UserDataTable table = new AppDatabase1DataSet.Sys_UserDataTable();
4
5 AppDatabase1DataSetTableAdapters.Sys_UserTableAdapter adapt = new SmartDeviceLinqDemo.AppDatabase1DataSetTableAdapters.Sys_UserTableAdapter();
6
7 adapt.Fill(table);
8
9 var query = from user in table.AsEnumerable()
10 where user.Field<string>("User_Name") == "Gordon"
11 select new {
12 SysNo = user.Field<int>("SysNo"),
13 User_Id = user.Field<string>("User_Id"),
14 User_Name = user.Field<string>("User_Name"),
15 Mail = user.Field<string>("Mail")};
16
17 foreach (var user in query)
18 {
19 this.textBox1.Text += string.Format("SysNo = {0}, User_ID = {1}, User_Name = {2}, Mail = {3}", user.SysNo, user.User_Id, user.User_Name, user.Mail);
20 }
21 }
首先,要添加System.Data.DataSetExtensions的引用。然后添加一个数据库。我这里为了方便使用,添加了一个对应的DataSet。
填充DataTable,在查询时,将DataTable作为枚举,且字段查询时,要进行类型转换,最后select结果时,可以指定输出的强命名(作为属性)存储在query中。
至此.net CF中对Linq的介绍已经结束了。Linq的出现大大方便了开发人员,Linq提供了很多的功能还有待大家去深入研究。
Sample下载:SmartDeviceLinqDemo