1.Linq 查询表达式基础
Linq 查询应用程序始终将源数据视为 IEnumerable<T> 或 IQueryable<T> 集合。
LINQ查询表达式包含8个基本子句,分别为from、select、group、where、orderby、join、let和into。
子 句 | 备注 |
from | 指定数据源和范围变量 |
select | 指定当执行查询时返回的序列中的元素将具有的类型和形式 |
group | 按照指定的键值对查询结果进行分组 |
where | 根据一个或多个由逻辑“与”和逻辑“或”运算符(&&或 |
orderby | 基于元素类型的默认比较器按升序或降序对查询结果进行排序 |
join | 基于两个指定匹配条件之间的相等比较来连接两个数据源 |
let | 引入一个用于存储查询表达式中的子表达式结果的范围变量 |
into | 提供一个标识符,它可以充当对join、group或select子句的结果的引用 |
例子:随机生成20个从0到100的数字。
internal class Program
{private static List<int> scores = new List<int>();static void Main(string[] args){InitScores();getScores();Console.ReadKey();}private static void InitScores(){ Random random = new Random();for (int i = 0; i < 20; i++){ scores.Add(random.Next(0,100));}}//查出大于或等于60,分数倒序private static void getScores(){ IEnumerable<int> AllScore = from score in scoreswhere score >= 60orderby score descendingselect score;foreach (var item in AllScore){ Console.WriteLine(item);}}
}
2.LINQ常用操作
查询操作
通过from关键字指定数据源,使用where关键字进行过滤,使用select关键字进行投影。
var result = from student in students
where student.Age > 18
select student.Name;
或者使用方法语法:
var result = students.Where(student => student.Age > 18).Select(student => student.Name);
排序
使用OrderBy或OrderByDescending进行升序或降序排序。
var sortedStudents = students.OrderBy(student => student.Age);
分组
使用GroupBy根据指定属性进行分组。
var groupedStudents = students.GroupBy(student => student.Department);
连接
使用Join将两个数据源连接起来。
var joinedData = from student in students
join course in courses on student.CourseId equals course.Id
select new { student.Name, course.CourseName };
聚合
计算总和、计数、最小值和最大值以及平均值。
// Aggregation operations example
var maxScore = students.Max(student => student.Score);
var minScore = students.Min(student => student.Score);
var averageScore = students.Average(student => student.Score);
var totalScoreSum = students.Sum(student => student.Score);
var studentCount = students.Count(student => student.Age > 18);
集合操作
-
Distinct():删除重复值
-
Union():合并两个序列,没有重复
-
Intersect():从两个序列中检索公共元素
-
Except():从第一个序列中获取元素,而不是在第二个序列中获取元素
// Set operations example
var firstNames = new string[] { "John", "Jane", "Jim", "Jane" };
var lastNames = new string[] { "Doe", "Smith", "Adams", "John" }; var distinctFirstNames = firstNames.Distinct(); // "John", "Jane", "Jim"
var unionNames = firstNames.Union(lastNames); // "John", "Jane", "Jim", "Doe", "Smith", "Adams"
var intersectNames = firstNames.Intersect(lastNames); // "John"
元素和生成运算符
元素运算符从数据源中检索特定元素,例如按索引访问数组元素。典型的元素运算符包括 、 、 和 。例如,看看我们如何获得第一个分数大于 80 的学生:
First FirstOrDefault Last LastOrDefault Single SingleOrDefault ElementAt
// Element operator example
var firstHighScorer = students.First(student => student.Score > 80);
看一个使用运算符访问列表中的第五个学生的示例:ElementAt
// Element operator example - ElementAt
var fifthStudent = students.ElementAt(4); // Zero-based index
生成运算符(如 、 和 )创建具有特定特征的集合的新实例。当您需要以编程方式生成集合时,它们会派上用场。下面是一个使用 和 的示例:
// Generation operator example - Range
var numbers = Enumerable.Range(1, 10); // Generates numbers 1 to 10 // Generation operator example - Repeat
var repeatedValue = Enumerable.Repeat("Hello", 5); // Creates an IEnumerable with 5 "Hello" values
LinQ 查询中的分区和分页
-
Take(n):检索第一个元素n
-
Skip(n):跳过第一个元素并返回其余元素n
-
TakeWhile(condition):在特定条件成立时取元素
-
SkipWhile(condition):在条件为 true 时跳过元素并返回其余元素
演示使用 和 进行分页:SkipTake
// Pagination example
int pageNumber = 1;
int pageSize = 5; var page = students .Skip((pageNumber - 1) \* pageSize) .Take(pageSize);
要检索学生的第二页,只需更改值:pageNumber