找回密码
 立即注册
快捷导航

[.NET] SQL 到 LINQ:.NET 开发人员应该了解的 10 个基本查询

[复制链接]
海棠 2024-12-14 07:05:15 | 显示全部楼层

从 SQL(结构化查询语言)转向 LINQ(语言集成查询)可以显著提高您在 .NET 中的数据交互技能。

虽然 SQL 一直是查询数据库的标准,但 LINQ 提供了与 C# 的无缝集成,从而允许类型安全和高效的查询。本文介绍了 10 个基本的 SQL 到 LINQ 转换

1. 基本 SELECT 查询

SQL 查询:

SELECT * FROM Employees;

LINQ (方法语法):

var query = dbContext.Employees.ToList();

LINQ (查询语法):

var query = from e in dbContext.Employees  
            select e;

基本查询从表中检索所有行。在 LINQ 中,您可以使用带有 method syntax with 的方法语法或带有简单 .SELECTEmployeesToList()select

using 将所有员工记录加载到内存中,以便于在应用程序中进一步操作这些记录。请务必注意,如果您的数据集很大,此操作可能会占用大量资源,因为它会一次检索所有内容。当您需要显示所有数据时,例如在网格视图或报表中,通常使用此方法。ToList()

2. 带有 WHERE 子句的 SELECT

SQL 查询:

SELECT * FROM Employees WHERE Age > 30;

LINQ (方法语法):

var query = dbContext.Employees.Where(e => e.Age > 30).ToList();

LINQ (查询语法):

var query = from e in dbContext.Employees  
            where e.Age > 30  
            select e;

该子句根据特定条件筛选结果,例如检索 30 岁以上的员工。在 LINQ 中,可以使用查询语法中的 method 或 clause 来实现此目的。WHEREWherewhere

在需要分析或仅显示相关信息的应用程序中,筛选数据至关重要。此方法减少了加载到内存中的数据量,从而提高了性能并确保用户只能看到他们需要的内容。此外,使用条件有助于维护数据隐私和相关性。

3. INNER JOIN 查询

SQL 查询:

SELECT Employees.Name, Departments.Name  
FROM Employees  
INNER JOIN Departments ON Employees.DepartmentId = Departments.Id;

LINQ (方法语法):

var query = dbContext.Employees.Join(  
    dbContext.Departments,  
    e => e.DepartmentId,  
    d => d.Id,  
    (e, d) => new { EmployeeName = e.Name, DepartmentName = d.Name }  
).ToList();

LINQ (查询语法):

var query = from e in dbContext.Employees  
            join d in dbContext.Departments  
            on e.DepartmentId equals d.Id  
            select new { e.Name, d.Name };

该查询根据相关列合并两个表中的行。在此示例中,我们使用 .INNER JOINEmployeesDepartmentsDepartmentId

在 LINQ 中,您可以使用方法或查询语法来实现此目的。此操作对于从不同的表中检索相关数据至关重要,使开发人员能够向用户呈现全面的信息。它演示了关系数据是如何链接的,并且对于报告和分析至关重要。Join

对于多个表,联接可能会变得复杂,但对于任何依赖关系数据库的应用程序来说,联接都是必不可少的。了解如何构建这些查询将有助于您更有效地使用 LINQ。

4. GROUP BY 查询

SQL 查询:

SELECT DepartmentId, COUNT(*)  
FROM Employees  
GROUP BY DepartmentId;

LINQ (方法语法):

var query = dbContext.Employees  
    .GroupBy(e => e.DepartmentId)  
    .Select(g => new { DepartmentId = g.Key, EmployeeCount = g.Count() })  
    .ToList();

LINQ (查询语法):

var query = from e in dbContext.Employees  
            group e by e.DepartmentId into g  
            select new { DepartmentId = g.Key, EmployeeCount = g.Count() };

该子句聚合数据,使您能够执行计算,例如计算每个部门的员工人数。在 LINQ 中,这是通过后续投影完成的,以创建一个同时保存部门 ID 和员工计数的新匿名对象。GROUP BYGroupBy

在需要洞察和分析的应用程序中,聚合数据至关重要。它允许开发人员有效地汇总信息,从而更容易识别趋势,例如哪些部门有更多的员工或人员配备是否不平衡。

此外,分组可以与其他聚合函数(如 或 )结合使用,以提供更深入的洞察。此功能使其成为任何开发人员武器库中的强大工具。SumAverage

5. COUNT 行数

SQL 查询:

SELECT COUNT(*) FROM Employees;

LINQ (方法语法):

var count = dbContext.Employees.Count();

该函数检索表中的记录总数。在 LINQ 中,您可以使用该方法来实现此目的。COUNTCount

了解记录总数对于应用程序、分析和整体数据管理中的分页通常至关重要。它可以指导有关数据表示和用户界面设计的决策,帮助开发人员有效地实现页面计数和加载时间等功能。

6. 排序依据

SQL 查询:

SELECT * FROM Employees ORDER BY Name;

LINQ (方法语法):

var query = dbContext.Employees.OrderBy(e => e.Name).ToList();

LINQ (查询语法):

var query = from e in dbContext.Employees  
 orderby e.Name  
 select e;

该子句根据一列或多列对查询结果进行排序。在本例中,我们按员工的姓名对员工进行排序。ORDER BY

对数据进行排序对于可用性至关重要,尤其是在用户需要快速查找信息的应用程序中。正确排序的数据可以提高可读性和用户体验,从而更容易找到特定条目。

在 LINQ 中,可以使用 或 进行排序,还可以应用多个排序条件 using 进行分层排序。这种灵活性使开发人员能够满足各种用户需求。OrderByorderbyThenBy

7. LEFT JOIN 查询

SQL 查询:

SELECT Employees.Name, Departments.Name  
FROM Employees  
LEFT JOIN Departments ON Employees.DepartmentId = Departments.Id;

LINQ (方法语法):

var query = dbContext.Employees.GroupJoin(  
    dbContext.Departments,  
    e => e.DepartmentId,  
    d => d.Id,  
    (e, d) => new { Employee = e, Departments = d.DefaultIfEmpty() }  
).SelectMany(ed => ed.Departments.Select(d => new { ed.Employee.Name, DepartmentName = d?.Name }))  
.ToList();

LINQ (查询语法):

var query = from e in dbContext.Employees  
            join d in dbContext.Departments on e.DepartmentId equals d.Id into dept  
            from d in dept.DefaultIfEmpty()  
            select new { e.Name, DepartmentName = d?.Name };

A 从左表 () 中检索所有记录,从右表 () 中检索匹配的记录。如果没有匹配项,则为正确的表返回 NULL 值。LEFT JOINEmployeesDepartments

在 LINQ 中,实现 a 涉及使用 和 。当您想要显示所有员工(无论他们是否属于某个部门)时,此技术非常有用,有助于识别没有分配部门的员工。LEFT JOINGroupJoinSelectMany

了解如何在 LINQ 中实现可以显著提高应用程序中的数据分析和报告功能。LEFT JOIN

8. RIGHT JOIN 查询

SQL 查询:

SELECT Employees.Name, Departments.Name  
FROM Employees  
RIGHT JOIN Departments ON Employees.DepartmentId = Departments.Id;

LINQ (方法语法):

var query = dbContext.Departments.GroupJoin(  
    dbContext.Employees,  
    d => d.Id,  
    e => e.DepartmentId,  
    (d, e) => new { Department = d, Employees = e.DefaultIfEmpty() }  
).SelectMany(de => de.Employees.Select(e => new { e?.Name, DepartmentName = de.Department.Name }))  
.ToList();

LINQ (查询语法):

var query = from d in dbContext.Departments  
            join e in dbContext.Employees on d.Id equals e.DepartmentId into emp  
            from e in emp.DefaultIfEmpty()  
            select new { EmployeeName = e?.Name, d.Name };

A 从右表 () 中检索所有记录,从左表 () 中检索匹配的记录。如果没有匹配项,则为左表返回 NULL 值。RIGHT JOINDepartmentsEmployees

在 LINQ 中,实现 a 需要与 类似的方法,但从正确的表开始。此操作可用于识别没有员工的部门,从而深入了解组织结构。RIGHT JOINLEFT JOIN

理解对于全面的数据报告至关重要,尤其是在您需要确保一个表中的所有实体都显示在输出中的情况下。RIGHT JOIN

9. FULL OUTER JOIN 查询

SQL 查询:

SELECT Employees.Name, Departments.Name  
FROM Employees  
FULL OUTER JOIN Departments ON Employees.DepartmentId = Departments.Id;

LINQ (方法语法):

var employees = dbContext.Employees.Select(e => new { e.Name, e.DepartmentId });  
var departments = dbContext.Departments.Select(d => new { d.Name, DepartmentId = d.Id });  

var query = (from e in employees  
             join d in departments on e.DepartmentId equals d.DepartmentId into empDept  
             from d in empDept.DefaultIfEmpty()  
             select new { e.Name, DepartmentName = d?.Name })  
            .Union(  
             from d in departments  
             join e in employees on d.DepartmentId equals e.DepartmentId into deptEmp  
             from e in deptEmp.DefaultIfEmpty()  
             select new { EmployeeName = e?.Name, d.Name }  
            ).ToList();

LINQ (查询语法):

var query = (from e in dbContext.Employees  
             join d in dbContext.Departments on e.DepartmentId equals d.Id into empDept  
             from d in empDept.DefaultIfEmpty()  
             select new { e.Name, DepartmentName = d?.Name })  
            .Union(  
             from d in dbContext.Departments  
             join e in dbContext.Employees on d.Id equals e.DepartmentId into deptEmp  
             from e in deptEmp.DefaultIfEmpty()  
             select new { EmployeeName = e?.Name, d.Name }  
            );

当 left () 或 right () 表中存在匹配项时,A 将检索所有记录。如果没有匹配项,则返回 NULL 值。FULL OUTER JOINEmployeesDepartments

在 LINQ 中,实现 a 涉及执行两个单独的查询并使用 .此操作对于全面的数据分析至关重要,它允许开发人员查看所有员工和部门,即使存在不匹配的条目。FULL OUTER JOINUnion

有效使用可以增强报告功能,从而提供两个表之间关系的完整图片。FULL OUTER JOIN

10. CROSS JOIN 查询

SQL 查询:

SELECT Employees.Name, Departments.Name  
FROM Employees  
CROSS JOIN Departments;

LINQ (方法语法):

var query = dbContext.Employees.SelectMany(  
    e => dbContext.Departments,  
    (e, d) => new { e.Name, d.Name }  
).ToList();

LINQ (查询语法):

var query = from e in dbContext.Employees  
            from d in dbContext.Departments  
            select new { e.Name, d.Name };

A 生成两个表的笛卡尔积,这意味着第一个表中的每一行都与第二个表中的每一行合并。CROSS JOIN

在 LINQ 中,这是通过使用 OR 声明两个子句来实现的。虽然由于结果集可能很大,因此不经常使用,但对于生成数据组合(例如测试方案或创建将所有员工与所有部门进行比较的报告)可能有益。SelectManyfromCROSS JOIN

从 SQL 过渡到 LINQ 为增强 C# 中的数据库交互开辟了一个新的可能性领域。通过掌握这 10 个基本查询,您不仅可以提高编码效率,还可以充分利用 LINQ 的潜力来创建强大的应用程序。

当您将 LINQ 集成到工作流中时,您会发现它促进了一种更优雅、更具表现力的数据查询方法。这种转变不仅仅是关于语法;它是关于采用一种优先考虑代码清晰度和可维护性的范式。

在这些技术上投入时间将提升您的技能,并使您能够提供高质量、可扩展的解决方案。通过利用 LINQ 的强大功能,您可以将自己定位为适应性更强、效率更高的开发人员,随时准备自信和精确地应对复杂的数据挑战。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

温馨提示

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

Archiver|手机版|小黑屋|DLSite

GMT+8, 2025-1-18 13:14

Powered by Discuz! X3.5 and PHP8

快速回复 返回顶部 返回列表