Linq专题之创建Linq查询表达式

  本节我们主要介绍一下如何创建查询集合类型,关系数据库类型,DataSet对象类型和XML类型的数据源的Linq查询表达式。

  下面在实例代码ReadyCollectionData()函数创建了准备的数据源:

1、创建集合类型的查询。

创建一个UserBaseInfo类:

 1  public class UserBaseInfo
 2     {
 3         private List<string> aliasname;
 4         private int id;
 5         private string email;
 6         private int roleid;
 7         private string username;
 8
 9         public UserBaseInfo(int Id, string userName, string email, List<string> aliasName)
10             : this(Id, userName, email)
11         {
12
13             this.aliasname = aliasName;
14         }
15
16         public UserBaseInfo(int Id, string userName, string email)
17         {
18             this.id = Id;
19             this.username = userName;
20             this.email = email;
21         }
22
23         public UserBaseInfo(int Id, string userName, string email, int roleId)
24             : this(Id, userName, email)
25         {
26             this.roleid = roleId;
27         }
28 public UserBaseInfo(int Id, string userName, string email, int roleId, List<string> aliasName)
29             : this(Id, userName, email, roleId)
30         {
31             this.aliasname = aliasName;
32         }
33
34         public List<string> AliasName
35         {
36             get { return this.aliasname; }
37             set { this.aliasname = AliasName; }
38         }
39
40         public int ID
41         {
42             get { return this.id; }
43             set
44             {
45                 this.id = ID;
46             }
47         }
48
49         public string Email
50         {
51             get { return this.email; }
52             set { this.email = Email; }
53         }
54
55         public int RoleId
56         {
57             get { return this.roleid; }
58             set { this.roleid = RoleId; }
59         }
60
61         public string UserName
62         {
63             get { return this.username; }
64             set { this.username = UserName; }
65         }
66     }

ReadyCollectionData方法准备数据源:

 1 private void ReadyCollectionData()
 2         {
 3             //创建一个数组
 4             int[] datasource = new int[100];
 5
 6             for(int i=0;i<100;i++)
 7             {
 8                 datasource[i] = i;
 9             }
10
11             //准备数据源创建一个泛型列表元素类型为UserBaseInfo
12             List<UserBaseInfo> users = new List<UserBaseInfo>();
13
14             for (int i = 1; i < 10; i++)
15             {
16                 users.Add(new UserBaseInfo(i, "user0" + i.ToString(), "user0" + i.ToString() + "@web.com"));
17             }
18         }

下面我们来创建一个Linq查询表达式来查询出ID大于3的元素:

1 //以下是创建Linq查询
2             var result = from u in users
3
4                 where u.ID > 3
5                 select u;

最终的代码:

 1  private void ReadyCollectionData()
 2         {
 3             //创建一个数组
 4             int[] datasource = new int[100];
 5
 6             for (int i = 0; i < 100; i++)
 7             {
 8                 datasource[i] = i;
 9             }
10
11             //准备数据源创建一个泛型列表元素类型为UserBaseInfo
12             List<UserBaseInfo> users = new List<UserBaseInfo>();
13
14             for (int i = 1; i < 10; i++)
15             {
16                 users.Add(new UserBaseInfo(i, "user0" + i.ToString(), "user0" + i.ToString() + "@web.com"));
17             }
18
19
20             //以下是创建Linq查询
21             var result = from u in users
22
23                          where u.ID > 3
24                          select u;
25
26             foreach (var u in result)
27             {
28                 Response.Write("ID:" + u.ID + "</br>" + "username:" + u.UserName+"</br>");
29             }
30
31         }

看看输出结果:

是不是已经完成过滤了。其实和sql的查询语句很像。

2、创建DataSet类型的查询表达式。

创建一个userinfo表,做默认数据如下:

然后我们的代码里面的函数ReadyDataSetData()用来获取userinfo表里面的数据,通过linq进行过滤。

 1 private void ReadyDataSetData()
 2         {
 3             SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["LinqDBConnectionString"].ConnectionString);
 4
 5             string cmdText = "SELECT * FROM UserInfo";
 6             ///创建执行SQL语句的命令
 7             SqlDataAdapter da = new SqlDataAdapter(cmdText, con);
 8             ///打开数据库的连接
 9             con.Open();
10             ///执行查询操作
11             DataSet ds = new DataSet();
12             da.Fill(ds, "UserInfo");
13             con.Close();
14
15             //以下为linq查询表达式:
16             var result = from u in ds.Tables["userinfo"].AsEnumerable()
17                 where u.Field<int>("id") > 5
18                 select u;
19
20         }

可以看出我们的代码中是过滤出 id大于5的元素。

看到查询结果和我们预想的一样。

3、创建sqlserver数据库类型的查询表达式。

我们依然用sql中的userinfo表

 1  private void ReadyDatabaseData()
 2         {    ///准备数据源,创建LinqDB数据库的数据上下文类的实例
 3             LinqDBDataContext db = new LinqDBDataContext(ConfigurationManager.ConnectionStrings["LinqDBConnectionString"].ConnectionString);
 4             Table<userinfo> users = db.userinfo;
 5             ///以下为LINQ查询表达式
 6
 7             var result = from u in users
 8                          where u.id > 3 && u.id < 5
 9                          select u;
10         }

看代码是过滤 id大于3且小于5的,那么就只有id为4的了。看结果:

4、最后一个查询,创建XML查询语句。

 1 private void ReadyXmlData()
 2         {    ///准备数据源,创建XML类型的数据源
 3             string xmlString =
 4             "<Books>"
 5               + "<Book ID=\"101\">"
 6                  + "<No>00001</No>"
 7                  + "<Name>Book 0001</Name>"
 8                  + "<Price>100</Price>"
 9                  + "<Remark>This is a book 00001.</Remark>"
10                + "</Book>"
11                + "<Book ID=\"102\">"
12                  + "<No>00002</No>"
13                  + "<Name>Book 0002</Name>"
14                  + "<Price>200</Price>"
15                  + "<Remark>This is a book 00002.</Remark>"
16                + "</Book>"
17                + "<Book ID=\"103\">"
18                  + "<No>0006</No>"
19                  + "<Name>Book 0006</Name>"
20                  + "<Price>600</Price>"
21                  + "<Remark>This is a book 0006.</Remark>"
22                + "</Book>"
23              + "</Books>";
24 ///导入XML文件
25             XElement xmlDoc = XElement.Parse(xmlString);
26             ///以下为LINQ查询表达式
27
28             var result = from e in xmlDoc.Elements("Book")
29                          where (string)e.Element("Name") == "Book 0002"
30                          select e;
31
32             foreach (var u in result)
33             {
34                 Response.Write("NO:" + (string)u.Element("No") + "</br>" + "Name:" + (string)u.Element("Name") + "</br>");
35             }
36         }

ReadyXmlData方法中我们创建了一个xml文档,然后过滤出Book元素且Name为"Book ooo2"的元素。

我们先简单了解了一下Linq对四种对象的查询方法,后面我们会有更详细的讲解。

时间: 2024-08-05 18:07:49

Linq专题之创建Linq查询表达式的相关文章

查询表达式和LINQ to Objects

查询表达式实际上是由编译器“预处理”为“普通”的C#代码,接着以完全普通的方式进行编译.这种巧妙的发式将查询集合到了语言中,而无须把语义改得乱七八糟 LINQ的介绍 LINQ中的基础概念 降低两种数据模型之间的阻抗失配过程中,遇到的一个问题就是,通常会涉及创建另一个模型来作为桥梁 序列 它通过IEnumerable和IEnumerable<T>接口进行封装 序列和其他集合数据结构最大的区别:当你从序列读取数据的时候,通常不知道还有多少数据项等待读取,或者不能访问任意的数据项——只能是当前这个

Lambda表达式和查询表达式(1)基本概念

Lambda表达式也是一种匿名函数(anonymous function),比匿名方法具有更加简洁的表示形式.它可以包含表达式和语句,并且适用于创建委托和事件. 查询表达式: 是一种使用查询语法表示的表达式,它可以从一个或多个给定的数据源中检索数据,并制定检索结果的表现形式. Lambda表达式:  由输入参数.Lambda运算符和表达式(或语句块)构成. 它的语法形式如下: (input parameters) => empression; : input parameters : 表示输入参

Linq学习之旅——LINQ查询表达式

1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述 LINQ的全称是Language Integrated Query,中文译成“语言集成查询”.LINQ作为一种查询技术,首先要解决数据源的封装,大致使用了三大组件来实现这个封装,分别是LINQ to Object.LINQ to ADO.NET.LINQ to XML.它们和.NET语言的关系如下:

LINQ查询表达式基础

LINQ,语言集成查询(Language Integrated Query)是一组用C#和Visual Basic语言的扩展. 对于编写查询的开发人员来说,LINQ 最明显的"语言集成"部分是查询表达式.查询表达式是使用 C# 3.0 中引入的声明性查询语法编写的.通过使用查询语法,你甚至可以使用最少的代码对数据源执行复杂的筛选.排序和分组操作.你使用相同的基本查询表达式模式来查询和转换 SQL 数据库.ADO.NET 数据集.XML 文档和流以及 .NET 集合中的数据. 下面我们通

LINQ查询表达式(3) - LINQ 查询分组

对查询结果进行分组 分组是 LINQ 最强大的功能之一. 下面的示例演示如何以各种方式对数据进行分组: 按照单个属性. 按照字符串属性的首字母. 按照计算出的数值范围. 按照布尔谓词或其他表达式. 按照复合键. 此外,最后两个查询将它们的结果投影到一个新的匿名类型中,该类型仅包含学生的名字和姓氏. //单个属性作为组键对源元素进行分组 var queryLastNames = from student in students group student by student.LastName i

《C#本质论》读书笔记(15)使用查询表达式的LINQ

15.1 查询表达式的概念 15.1.1 投射 15.1.2 筛选 15.1.3 排序 15.1.4 let子句 15.1.5 分组 15.1.6 使用into进行查询延续 15.1.7 用多个from子句"平整"序列的序列 15.2 查询表达式作为方法调用 简单的查询表达式 private static void ShowContextualKeywords1() { IEnumerable<string> selection = from word in Keyword

LINQ 查询表达式(C# 编程指南)

语言集成查询 (LINQ) 是一组技术的名称,这些技术建立在将查询功能直接集成到 C# 语言(以及 Visual Basic 和可能的任何其他 .NET 语言)的基础上.  借助于 LINQ,查询现在已是高级语言构造,就如同类.方法.事件等等. 对于编写查询的开发人员来说,LINQ 最明显的"语言集成"部分是查询表达式.  查询表达式是使用 C# 3.0 中引入的声明性查询语法编写的.  通过使用查询语法,您甚至可以使用最少的代码对数据源执行复杂的筛选.排序和分组操作.  您使用相同的

LINQ查询表达式---------let子句

LINQ查询表达式---------let子句 let子句创建一个范围变量来存储结果,变量被创建后,不能修改或把其他表达式的结果重新赋值给它.此范围变量可以再后续的LINQ子句中使用. class Program { static void Main(string[] args) { int[] number = { 12, 15, 16, 17, 18, 19, 20 }; var query = from num in number let n = num % 2 where n == 0

LINQ之路 5:LINQ查询表达式

书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询表达式(Query Expression). LINQ方法语法的本质是通过扩展方法和Lambda表达式来创建查询.C# 3.0对于LINQ表达式还引入了声明式的查询表达式,也叫查询语法,通常来讲,它是创建LINQ查询的更加快捷的方式.尽管通过查询语法写出的查询比较类似于SQL查询,但实际上查询表达式的产生并不是建立在SQL之上,而是建立在函数式编程语言如LISP和Haskell中的list comprehensio