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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【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 的强大功能,我们可以构建出高度灵活且易于扩展的数据访问层,从而提高生产力并降低维护成本。

相关文章
|
5天前
|
SQL 运维 监控
SQL查询太慢?实战讲解YashanDB SQL调优思路
本文是Meetup第十期“调优实战专场”的第二篇技术文章,上一篇《高效查询秘诀,解码YashanDB优化器分组查询优化手段》中,我们揭秘了YashanDB分组查询优化秘诀,本文将通过一个案例,助你快速上手YashanDB慢日志功能,精准定位“慢SQL”后进行优化。
|
3天前
|
SQL 大数据 数据挖掘
玩转大数据:从零开始掌握SQL查询基础
玩转大数据:从零开始掌握SQL查询基础
69 35
|
3天前
|
Web App开发 移动开发 前端开发
React音频播放器样式自定义全解析:从入门到避坑指南
在React中使用HTML5原生&lt;audio&gt;标签时,开发者常面临视觉一致性缺失、样式定制局限和交互体验割裂等问题。通过隐藏原生控件并构建自定义UI层,可以实现完全可控的播放器视觉风格,避免状态不同步等典型问题。结合事件监听、进度条拖拽、浏览器兼容性处理及性能优化技巧,可构建高性能、可维护的音频组件,满足跨平台需求。建议优先使用成熟音频库(如react-player),仅在深度定制需求时采用原生方案。
50 12
|
2月前
|
SQL 安全 数据库
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
176 77
|
22天前
|
SQL 关系型数据库 分布式数据库
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
|
14天前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
30 1
|
3天前
|
SQL 索引
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
2月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
62 17
|
2月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
21天前
|
SQL 数据可视化 IDE
SQL做数据分析的困境,查询语言无法回答的真相
SQL 在简单数据分析任务中表现良好,但面对复杂需求时显得力不从心。例如,统计新用户第二天的留存率或连续活跃用户的计算,SQL 需要嵌套子查询和复杂关联,代码冗长难懂。Python 虽更灵活,但仍需变通思路,复杂度较高。相比之下,SPL(Structured Process Language)语法简洁、支持有序计算和分组子集保留,具备强大的交互性和调试功能,适合处理复杂的深度数据分析任务。SPL 已开源免费,是数据分析师的更好选择。

热门文章

最新文章

推荐镜像

更多