LINQ
一.lINQ使用
1.lINQ简介
(1)概念:语言集成查询 (LINQ),它在对象领域和数据领域之间架起了一座桥梁。。
(2)使用场景:SQL Server 数据库、XML文档、ADO.NET数据集,以及支持IEnumerable或泛型IEnumerable<T>接口的任意对象集合。
(3)LINQ操作三部分
LINQ查询操作都由以下三个不同的操作组成:
1. 获取数据源。
2. 创建查询。
3. 执行查询。
Eg:
class IntroToLINQ
{
static void Main()
{
// 1. 获取数据源
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
// 2.创建查询
// numQuery是 IEnumerable<int>类型
var numQuery =
from num in numbers
where (num % 2) == 0
select num;
// 3.执行查询
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
}
}
2.修改查询
2.1对结果排序
//查询格式:
var sortedGroups =
from student in students
orderby student.Last, student.First
group student by student.Last[0] into newGroup
select newGroup;
// 执行格式:
Console.WriteLine(Environment.NewLine + "sortedGroups:");
foreach (var studentGroup in sortedGroups)
{
Console.WriteLine(studentGroup.Key);
foreach (var student in studentGroup)
{
Console.WriteLine(" {0}, {1}", student.Last, student.First);
}
}
2.2按键值对组进行排序
当您运行前面的查询时,会注意到组没有按字母顺序排列。若要改变这种情况,您必须在group子句后提供orderby子句。但要使用orderby子句,您首先需要一个标识符,用作对group子句创建的组的引用。可以使用into关键字来提供此标识符。
var studentQuery4 =
from student in students
group student by student.Last[0] into studentGroup
orderby studentGroup.Key
select studentGroup;
foreach (var groupOfStudents in studentQuery4)
{
Console.WriteLine(groupOfStudents.Key);
foreach (var student in groupOfStudents)
{
Console.WriteLine(" {0}, {1}",
student.Last, student.First);
}
}
2.3使用 let引入标识符
您可以使用let关键字为查询表达式中的任何表达式结果引入标识符。此标识符可以提供方便(如下面的示例所示),也可以通过存储表达式的结果来避免多次计算,从而提高性能。
var studentQuery5 =
from student in students
let totalScore = student.Scores[0] + student.Scores[1] +
student.Scores[2] + student.Scores[3]
where totalScore / 4 < student.Scores[0]
select student.Last + " " + student.First;
foreach (string s in studentQuery5)
{
Console.WriteLine(s);
}
2.4在查询表达式中使用方法语法
下面的代码计算源序列中每个 Student的总分,然后对该查询的结果调用Average()方法来计算班级的平均分。请注意,查询表达式的两边使用了括号。
var studentQuery6 =
from student in students
let totalScore = student.Scores[0] + student.Scores[1] +
student.Scores[2] + student.Scores[3]
select totalScore;
double averageScore = studentQuery6.Average();
Console.WriteLine("Class average score = {0}", averageScore);
2.5在select语句中使用匿名类型
var studentQuery8 =
from student in students
let x = student.Scores[0] + student.Scores[1] +
student.Scores[2] + student.Scores[3]
where x > averageScore
select new { id = student.ID, score = x };
foreach (var item in studentQuery8)
{
Console.WriteLine("Student ID: {0}, Score: {1}", item.id, item.score);
}
3.使用LINQ进行数据转换
语言集成查询(LINQ)不仅可用于检索数据,而是还是一个功能强大的数据转换工具。通过使用 LINQ查询,您可以将源序列用作输入,并采用多种方式修改它以创建新输出序列。您可以通过排序和分组来修改序列本身,而不必修改元素本身。 但是,LINQ查询最强大的功能可能在于它能够创建新类型。这一功能在select子句中实现。例如,可以执行下列任务:
(1)将多个输入序列合并到具有新类型的单个输出序列中。
(2)创建其元素只包含源序列中的各个元素的一个或几个属性的输出序列。
(3)创建不同格式的输出序列。例如,您可以将SQL行或文本文件的数据转换为XML。
(4)创建其元素包含对源数据执行的操作结果的输出序列。
3.1将多个输入联接到一个输出序列
可以使用LINQ查询来创建包含多个输入序列的元素的输出序列。下面的示例演示如何组合两个内存中的数据结构,但组合来自XML或