详解LINQ入门(上篇)
LINQ简介
LINQ全称是“Language Integrated Query”,是.NET语言的一项重要特性,提供了一种方便的方式来查询数据,不仅支持关系型数据库,还可以用于XML文件、对象集合等数据源。它的出现简化了我们的代码逻辑,提高了开发效率。
面向对象和面向过程的编程风格
在介绍如何使用LINQ之前,我们先来简单了解一下面向对象和面向过程的编程风格。
-
面向对象编程(OOP): 将数据和对数据的操作封装起来,形成一个类,通过创建类的对象来调用其中的方法来实现某一功能,这样会更加便于管理和维护代码,提高了代码的复用性和可扩展性。
-
面向过程编程(POP): 是一种比较传统的编程风格,以功能为中心,按照一定的流程进行编写,代码的执行流程严格按照代码的编写顺序进行。这样容易使代码变得臃肿不堪,管理和维护十分困难,可扩展性比较差。
LINQ的特性
在使用LINQ时,需要注意以下几点:
- LINQ可以查询任何数据,包括XML、JSON、对象等。
- LINQ有统一的语法风格,包括查询语法和方法语法,可以随意切换。
- LINQ操作返回的都是IEnumerable
,支持延迟加载(Lazy Loading),可以节省内存。
LINQ查询语法与方法语法
在LINQ中,查询语法和方法语法都可以用来进行查询操作,我们可以根据自己的实际情况选择一种适合自己的方式。
LINQ查询语法
查询语法与SQL语言类似,采用类似SQL语言的关键字方式构建查询,代码会更加简洁。
var result = from s in students
where s.Age > 18 && s.Score > 80.0
orderby s.Age descending
select s;
上述代码中,我们使用from
关键字定义了一个遍历students
集合的查询表达式,使用where
关键字过滤出符合条件的元素,并按照年龄降序排列,最后使用select
关键字将结果返回。
LINQ方法语法
方法语法采用方法调用的方式构建查询,代码会更加灵活,可以一步一步拼接操作。
var result = students.Where(s => s.Age > 18 && s.Score > 80.0)
.OrderByDescending(s => s.Age);
上述代码使用Where方法过滤出符合条件的元素,OrderByDescending方法按照年龄降序排列,最后返回结果。
示例1:在集合中查询元素
假设我们有一个学生类Student,包含姓名、年龄和成绩信息,现在我们要在学生集合中查找年龄大于18岁且成绩大于80.0的学生,代码如下:
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public double Score { get; set; }
}
List<Student> students = new List<Student>()
{
new Student { Name = "Tom", Age = 18, Score = 90.0 },
new Student { Name = "David", Age = 20, Score = 85.0 },
new Student { Name = "Lily", Age = 22, Score = 78.0 },
new Student { Name = "John", Age = 17, Score = 82.5 },
};
var result = from s in students
where s.Age > 18 && s.Score > 80.0
orderby s.Age descending
select s;
foreach (Student s in result)
{
Console.WriteLine("Name: {0}, Age: {1}, Score: {2}", s.Name, s.Age, s.Score);
}
上述代码中,我们先定义了一个List
输出结果为:
Name: David, Age: 20, Score: 85
Name: Tom, Age: 18, Score: 90
这里我们可以看到,使用LINQ查询语句可以快速地筛选出符合条件的学生,并按照指定的方式排序输出。
示例2:在XML文件中查询元素
假设我们有一个XML文件students.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<students>
<student name="Tom" age="18" score="90.0" />
<student name="David" age="20" score="85.0" />
<student name="Lily" age="22" score="78.0" />
<student name="John" age="17" score="82.5" />
</students>
现在我们要从该文件中查询年龄大于18岁且成绩大于80.0的学生,代码如下:
XDocument document = XDocument.Load("students.xml");
var result = from s in document.Descendants("student")
where (int)s.Attribute("age") > 18 && (double)s.Attribute("score") > 80.0
orderby (int)s.Attribute("age") descending
select new
{
Name = (string)s.Attribute("name"),
Age = (int)s.Attribute("age"),
Score = (double)s.Attribute("score")
};
foreach (var s in result)
{
Console.WriteLine("Name: {0}, Age: {1}, Score: {2}", s.Name, s.Age, s.Score);
}
上述代码中,我先使用XDocument读取students.xml文件,然后使用LINQ查询语句从中查询满足条件的学生,使用select语句将查询结果转换为一个匿名类型,并使用foreach语句遍历结果。
输出结果为:
Name: David, Age: 20, Score: 85
Name: Tom, Age: 18, Score: 90
这里我们可以看到,使用LINQ查询语句不仅可以查询对象集合,还可以查询XML文件等数据源,使用起来非常灵活方便。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解LINQ入门(上篇) - Python技术站