LINQ是VS2008中的一组功能,可为C#提供强大的查询功能。LINQ提供程序的程序集支持将LINQ与.NET Framework集合、SQL Server数据库、ADO.NET数据集和XML文档一起使用。
LINQ提供了一种跨数据源和数据格式的统一模型,实现查询。在LINQ中,可以使用相同的编码模式来查询和转换XML文档、SQL数据库、ADO.NET数据集以及.NET集合中的数据,LINQ的编写其意义类似SQL语句。
关键字 | 说明 |
---|---|
from | 指定范围变量和数据源 |
where | 根据bool表达式从数据源中筛选数据 |
select | 指定查询结果中的元素所具有的类型或表现形式 |
group | 对查询结果按照键/值分组 |
into | 提供一个标识符,它可以充当对join、group、或select子句结果的引用 |
orderby | 对查询出来的结果进行排序 |
join | 按照两个指定匹配条件对等连接两个数据源 |
left | 产生一个用于存储子表达式查询结果的范围变量 |
LINQ的方法语法是非常灵活和重要的,下面用一个案例演示LINQ结合Lambda表达式查询数据集。
class Program
{
//定义一个学生类
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public List<int> Scores { get; set; }
}
static void Main(string[] args)
{
//实例化学生类
List<Student> students = new List<Student>()
{
new Student{ ID=1,Name="张三",Scores=new List<int>{97,98,80,78 } },
new Student{ ID=2,Name="李四",Scores=new List<int>{85,49,72,83 } },
new Student{ ID=3,Name="王五",Scores=new List<int>{69,80,85,97 } },
new Student{ ID=4,Name="马六",Scores=new List<int>{65,89,62,94 } }
};
//查询第一门成绩大于70的同学
IEnumerable<Student> studentQueryone = students.Where(p => p.Scores[0] > 70);
foreach (var item in studentQueryone)
{
Console.WriteLine($"学生姓名:{item.Name} 成绩:{item.Scores[0]}" );
}
Console.WriteLine("------------------------------------------");
//添加筛选条件
IEnumerable<Student> studentQuerytwo = students.Where(p => p.Scores[0] > 70 && p.Scores[1]>80);
foreach (var item in studentQuerytwo)
{
Console.WriteLine($"学生姓名:{item.Name} 成绩:{item.Scores[0]}");
}
Console.WriteLine("------------------------------------------");
//对结果进行排序
IEnumerable<Student> studentQueryth = students.Where(p => p.Scores[0] > 70).OrderBy(p => p.Scores[0]);
foreach (var item in studentQueryth)
{
Console.WriteLine($"学生姓名:{item.Name} 成绩:{item.Scores[0]}");
}
Console.WriteLine("------------------------------------------");
//select投影
var studentQueryfor = students.Select(p => new { name = p.Name, chengji = (p.Scores[0] + p.Scores[1] + p.Scores[2] + p.Scores[3]) });
foreach (var item in studentQueryfor)
{
Console.WriteLine($"学生姓名:{item.name} 成绩:{item.chengji}");
}
}
}
在上个案例做投影查询总成绩的代码块中,查询总成绩的方法多少有点笨拙,在LINQ查询中页提供了聚合函数操作。比如我们常用到的Count()查询总个数,Max()最大值、Average()平准值等等。
var studentQueryfiv = students.Select(p => new { name = p.Name, chengji = p.Scores.Sum()});
foreach (var item in studentQueryfiv)
{
Console.WriteLine($"学生姓名:{item.name} 成绩:{item.chengji}");
}
LINQ的元素操作是从一个序列中查询,并返回单个特定的元素常见的执行元素操作运算符如下
方法名 | 说明 |
---|---|
Elementat() | 返回集合中指定索引处的元素 |
ElementatorDeafult() | 返回集合中指定索引处的元素,如果索引超出范围则返回默认值 |
First() | 返回集合中第一个元素 |
FirstOrDeafult() | 返回集合中第一个元素,如果没有返回默认值 |
Last() | 返回集合中最后一个元素 |
LasttOrDeafult() | 返回集合中最后一个元素,如果没有返回默认值 |
Single() | 返回集合中唯一元素 |
SingleOrDeafult() | 返回集合中唯一元素,如果没有返回默认值 |
var data = students.FirstOrDefault();
Console.WriteLine($"姓名:{data.Name},成绩{data.Scores.Sum()}");
所有元素操作运算返回值的类型均为集合中的元素类型,而非集合类型。所有元素操作都不支持查询语法的方式书写。当使用Elementat() 、First()、Last()、Single()运算时,在操作的集合中元素个数为0时会报错,使用相对应的 ElementatorDeafult()、FirstOrDeafult()、LasttOrDeafult()、SingleOrDeafult()可以避免报错并返回默认值。