深入解析Entity Framework Core中的自定义SQL查询与Raw SQL技巧:从基础到高级应用的全面指南,附带示例代码与最佳实践建议

简介: 【8月更文挑战第31天】本文详细介绍了如何在 Entity Framework Core (EF Core) 中使用自定义 SQL 查询与 Raw SQL。首先,通过创建基于 EF Core 的项目并配置数据库上下文,定义领域模型。然后,使用 `FromSqlRaw` 和 `FromSqlInterpolated` 方法执行自定义 SQL 查询。此外,还展示了如何使用 Raw SQL 进行数据更新和删除操作。最后,通过结合 LINQ 和 Raw SQL 构建动态 SQL 语句,处理复杂查询场景。本文提供了具体代码示例,帮助读者理解和应用这些技术,提升数据访问层的效率和灵活性。

使用 Entity Framework Core(EF Core)进行数据访问时,虽然其内置的 LINQ 查询功能已经相当强大,但在某些情况下,可能需要直接执行复杂的 SQL 语句来满足特定的查询需求。EF Core 提供了多种方式来执行自定义 SQL 查询,包括使用 Raw SQL。本文将以技术综述的形式,详细介绍如何在 EF Core 中实现自定义 SQL 查询与 Raw SQL,并通过具体的代码示例展示其实现过程。

首先,我们需要创建一个基于 EF Core 的项目。打开 Visual Studio,创建一个新的 .NET Core 控制台应用程序,并选择模板创建项目。接着,添加 EF Core 相关的 NuGet 包,如 Microsoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.SqlServer.Design

配置数据库上下文

Models 文件夹中,创建一个 BlogContext 类,用于定义数据库上下文。

using Microsoft.EntityFrameworkCore;

namespace YourProjectName.Models
{
   
    public class BlogContext : DbContext
    {
   
        public BlogContext(DbContextOptions<BlogContext> options)
            : base(options)
        {
   
        }

        public DbSet<Blog> Blogs {
    get; set; }
        public DbSet<Post> Posts {
    get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
   
            base.OnModelCreating(modelBuilder);

            // 配置实体关系
            modelBuilder.Entity<Blog>()
                .HasMany(b => b.Posts)
                .WithOne(p => p.Blog)
                .HasForeignKey(p => p.BlogId);
        }
    }
}

定义领域模型

Models 文件夹中,定义两个实体类 BlogPost

namespace YourProjectName.Models
{
   
    public class Blog
    {
   
        public int BlogId {
    get; set; }
        public string Url {
    get; set; }
        public DateTime CreatedAt {
    get; set; }
        public virtual ICollection<Post> Posts {
    get; set; }
    }

    public class Post
    {
   
        public int PostId {
    get; set; }
        public string Title {
    get; set; }
        public string Content {
    get; set; }
        public int BlogId {
    get; set; }
        public virtual Blog Blog {
    get; set; }
    }
}

使用 Raw SQL 查询

在 EF Core 中,可以通过 FromSqlRawFromSqlInterpolated 方法来执行自定义的 SQL 查询。下面将展示如何使用这两种方法来查询数据。

使用 FromSqlRaw

using System;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using YourProjectName.Models;

namespace YourProjectName
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            var options = new DbContextOptionsBuilder<BlogContext>()
                .UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFCoreCustomQueries;Trusted_Connection=True;")
                .Options;

            using (var context = new BlogContext(options))
            {
   
                // 添加一些测试数据
                context.Blogs.AddRange(
                    new Blog {
    Url = "http://example.com/blog1", CreatedAt = DateTime.Parse("2020-01-01"), Posts = new List<Post>
                    {
   
                        new Post {
    Title = "First Post", Content = "Content of the first post." },
                        new Post {
    Title = "Second Post", Content = "Content of the second post." }
                    }},
                    new Blog {
    Url = "http://example.com/blog2", CreatedAt = DateTime.Parse("2021-01-01"), Posts = new List<Post>
                    {
   
                        new Post {
    Title = "Third Post", Content = "Content of the third post." }
                    }}
                );

                context.SaveChanges();

                // 使用 FromSqlRaw 执行自定义 SQL 查询
                var customQueryResult = context.Blogs
                    .FromSqlRaw("SELECT * FROM Blogs WHERE CreatedAt > @0", DateTime.Parse("2020-01-01"))
                    .ToList();

                foreach (var blog in customQueryResult)
                {
   
                    Console.WriteLine($"Blog URL: {blog.Url}");
                }
            }
        }
    }
}

使用 FromSqlInterpolated

FromSqlInterpolated 方法允许使用字符串插值来构建 SQL 语句,同时自动处理参数绑定。

// 在 Main 方法中添加以下代码
var customQueryResultInterpolated = context.Blogs
    .FromSqlInterpolated($@"
        SELECT * 
        FROM Blogs 
        WHERE CreatedAt > {DateTime.Parse("2020-01-01")}")
    .ToList();

foreach (var blog in customQueryResultInterpolated)
{
   
    Console.WriteLine($"Blog URL: {blog.Url}");
}

使用 Raw SQL 更新和删除数据

除了查询外,还可以使用 Raw SQL 来执行更新和删除操作。

更新数据

// 在 Main 方法中添加以下代码
context.Database.ExecuteSqlRaw("UPDATE Blogs SET Url = 'http://newurl.com' WHERE BlogId = 1");
context.SaveChanges();

删除数据

// 在 Main 方法中添加以下代码
context.Database.ExecuteSqlRaw("DELETE FROM Blogs WHERE BlogId = 2");
context.SaveChanges();

复杂查询与动态 SQL

对于更复杂的查询场景,可以结合 LINQ 和 Raw SQL 来构建动态 SQL 语句。

// 在 Main 方法中添加以下代码
var startDate = DateTime.Parse("2020-01-01");
var endDate = DateTime.Parse("2021-01-01");

var complexQuery = context.Blogs
    .FromSqlInterpolated($@"
        SELECT b.*, COUNT(p.PostId) AS PostCount
        FROM Blogs b
        LEFT JOIN Posts p ON b.BlogId = p.BlogId
        WHERE b.CreatedAt BETWEEN {startDate} AND {endDate}
        GROUP BY b.BlogId, b.Url, b.CreatedAt")
    .ToList();

foreach (var blog in complexQuery)
{
   
    Console.WriteLine($"Blog URL: {blog.Url}, Post Count: {blog.PostCount}");
}

总结

通过上述步骤,我们展示了如何在 Entity Framework Core 中使用自定义 SQL 查询与 Raw SQL。从配置数据库上下文到定义领域模型,再到实现和使用 Raw SQL 查询,每个环节都体现了如何利用 EF Core 的强大功能来处理复杂的数据库操作。希望本文提供的示例代码和技术指南能够帮助你在实际项目中更好地应用这些技术,构建出高效且功能丰富的数据访问层。

自定义 SQL 查询和 Raw SQL 不仅能够简化复杂查询的需求,还能提高应用程序的灵活性和可维护性。结合 EF Core 的强大功能,我们可以构建出高度灵活且易于扩展的数据访问层,从而提高生产力并降低维护成本。

相关文章
|
6月前
|
SQL 数据可视化 关系型数据库
MCP与PolarDB集成技术分析:降低SQL门槛与简化数据可视化流程的机制解析
阿里云PolarDB与MCP协议融合,打造“自然语言即分析”的新范式。通过云原生数据库与标准化AI接口协同,实现零代码、分钟级从数据到可视化洞察,打破技术壁垒,提升分析效率99%,推动企业数据能力普惠化。
536 3
|
6月前
|
SQL 监控 关系型数据库
一键开启百倍加速!RDS DuckDB 黑科技让SQL查询速度最高提升200倍
RDS MySQL DuckDB分析实例结合事务处理与实时分析能力,显著提升SQL查询性能,最高可达200倍,兼容MySQL语法,无需额外学习成本。
|
6月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
6月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
7月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
461 18
|
5月前
|
SQL 关系型数据库 MySQL
(SQL)SQL语言中的查询语句整理
查询语句在sql中占了挺大一部分篇幅,因为在数据库中使用查询语句的次数远多于更新与删除命令。而查询语句比起其他语句要更加的复杂,可因为sql是数据库不可或缺的一部分,所以即使不懂,也必须得弄懂,以上。
342 0
|
7月前
|
SQL 人工智能 数据库
【三桥君】如何正确使用SQL查询语句:避免常见错误?
三桥君解析了SQL查询中的常见错误和正确用法。AI产品专家三桥君通过三个典型案例:1)属性重复比较错误,应使用IN而非AND;2)WHERE子句中非法使用聚合函数的错误,应改用HAVING;3)正确的分组查询示例。三桥君还介绍了学生、课程和选课三个关系模式,并分析了SQL查询中的属性比较、聚合函数使用和分组查询等关键概念。最后通过实战练习帮助读者巩固知识,强调掌握这些技巧对提升数据库查询效率的重要性。
245 0
|
10月前
|
SQL 关系型数据库 MySQL
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
|
8月前
|
SQL
SQL中如何删除指定查询出来的数据
SQL中如何删除指定查询出来的数据
|
9月前
|
SQL 存储 弹性计算
OSS Select 加速查询:10GB CSV 文件秒级过滤的 SQL 语法优化技巧
OSS Select 可直接在对象存储上执行 SQL 过滤,跳过文件下载,仅返回所需数据,性能比传统 ECS 方案提升 10~100 倍。通过减少返回列、使用等值查询、避免复杂函数、分区剪枝及压缩优化等技巧,可大幅降低扫描与传输量,显著提升查询效率并降低成本。
273 0

推荐镜像

更多
  • DNS