C# linq 查询语法与方法语法示例

在C#中,LINQ(Language Integrated Query)提供了两种查询语法:查询语法 (Query Syntax)和方法语法(Method Syntax)。两种语法在功能上是等价的,最终都会被编译器转换为方法调用。以下是两种语法的对比示例。


1. 查询语法(Query Syntax)

查询语法类似于SQL,使用 fromwhereselect 等关键字,适合简单的查询。

示例:

假设有一个 Students 集合,我们想查询年龄大于20的学生

c# 复制代码
var query = from student in Students
            where student.Age > 20
            select student;

说明:

  • from:指定数据源。
  • where:过滤条件。
  • select:选择要返回的数据。

2. 方法语法(Method Syntax)

方法语法使用扩展方法(如 WhereSelect 等)和Lambda表达式,适合复杂的查询。

示例:

同样的查询,使用方法语法实现。

C# 复制代码
var query = Students
    .Where(student => student.Age > 20)
    .Select(student => student);

说明:

  • Where:过滤条件。
  • Select:选择要返回的数据。
  • Lambda表达式 student => student.Age > 20 用于定义过滤条件。

3. 两种语法的对比示例

示例1:简单查询

查询所有年龄大于20的学生姓名。

查询语法:

C# 复制代码
var query = from student in Students
            where student.Age > 20
            select student.Name;

方法语法:

C# 复制代码
var query = Students
    .Where(student => student.Age > 20)
    .Select(student => student.Name);

示例2:排序

查询所有年龄大于20的学生,并按年龄升序排序。

查询语法:

C# 复制代码
var query = from student in Students
            where student.Age > 20
            orderby student.Age
            select student;

方法语法:

C# 复制代码
var query = Students
    .Where(student => student.Age > 20)
    .OrderBy(student => student.Age);

示例3:分组

按学生的年龄分组,并统计每组的学生数量。

查询语法:

C# 复制代码
var query = from student in Students
            group student by student.Age into ageGroup
            select new
            {
                Age = ageGroup.Key,
                Count = ageGroup.Count()
            };

方法语法:

C# 复制代码
var query = Students
    .GroupBy(student => student.Age)
    .Select(ageGroup => new
    {
        Age = ageGroup.Key,
        Count = ageGroup.Count()
    });

示例4:连接(JOIN)

假设有两个集合:StudentsCourses,查询学生和他们所选的课程。

查询语法:

C# 复制代码
var query = from student in Students
            join course in Courses
            on student.CourseId equals course.Id
            select new
            {
                StudentName = student.Name,
                CourseName = course.Name
            };

方法语法:

C# 复制代码
var query = Students
    .Join(Courses,
          student => student.CourseId,
          course => course.Id,
          (student, course) => new
          {
              StudentName = student.Name,
              CourseName = course.Name
          });

示例5:左连接(LEFT JOIN)

查询所有学生,即使他们没有选课。

查询语法:

C# 复制代码
var query = from student in Students
            join course in Courses
            on student.CourseId equals course.Id into studentCourses
            from sc in studentCourses.DefaultIfEmpty()
            select new
            {
                StudentName = student.Name,
                CourseName = sc?.Name ?? "No Course"
            };

方法语法:

C# 复制代码
var query = Students
    .GroupJoin(Courses,
               student => student.CourseId,
               course => course.Id,
               (student, courses) => new { student, courses })
    .SelectMany(
        x => x.courses.DefaultIfEmpty(),
        (student, course) => new
        {
            StudentName = student.student.Name,
            CourseName = course?.Name ?? "No Course"
        });

4. 两种语法的选择

  • 查询语法:适合简单的查询,尤其是当查询条件较少且逻辑简单时,代码更易读。
  • 方法语法:适合复杂的查询和操作,尤其是当需要链式调用多个方法时,代码更灵活。

总结

  • 查询语法 :类似于SQL,使用 fromwhereselect 等关键字。
  • 方法语法:使用扩展方法和Lambda表达式,适合复杂的查询。
  • 两种语法在功能上是等价的,选择哪种语法取决于个人偏好和查询的复杂性。
相关推荐
神仙别闹25 分钟前
基于C#+MySQL实现(WinForm)企业设备使用信息管理系统
开发语言·mysql·c#
czhaii37 分钟前
PLC脉冲位置 单片机跟踪读取记录显示
开发语言·c#
蜗牛沐雨1 小时前
Rust 中的 `PartialEq` 和 `Eq`:深入解析与应用
开发语言·后端·rust
Python私教1 小时前
Rust快速入门:从零到实战指南
开发语言·后端·rust
神仙别闹2 小时前
基于C#+SQL Server开发(WinForm)租房管理系统
数据库·oracle·c#
秋野酱2 小时前
基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)
java·spring boot·后端
小明.杨3 小时前
Django 中时区的理解
后端·python·django
有梦想的攻城狮3 小时前
spring中的@Async注解详解
java·后端·spring·异步·async注解
qq_12498707533 小时前
原生小程序+springboot+vue医院医患纠纷管理系统的设计与开发(程序+论文+讲解+安装+售后)
java·数据库·spring boot·后端·小程序·毕业设计
lybugproducer4 小时前
浅谈 Redis 数据类型
java·数据库·redis·后端·链表·缓存