原始 SQL 查询

原始 SQL 查询

通过 Entity Framework Core 可以在使用关系数据库时下降到原始 SQL 查询。当所需查询不能使用 LINQ 来表示时,可以使用原始 SQL 查询。

基本原生 SQL 查询

可使用 FromSqlRaw 扩展方法基于原始 SQL 查询开始 LINQ 查询。FromSqlRaw 只能在直接位于 DbSet<> 上的查询根上使用。

var blogs = context.Blogs
    .FromSql("SELECT * FROM dbo.Blogs")
    .ToList();Code language: JavaScript (javascript)

原生 SQL 查询可用于执行存储过程。

var blogs = context.Blogs
    .FromSql("EXECUTE dbo.GetMostPopularBlogs")
    .ToList();Code language: JavaScript (javascript)

完整示例

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;

namespace EFMysql
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new BloggingContext())
            {
                context.Riders.Add(new Rider() { Mount = EquineBeast.Donkey });
                context.SaveChanges();

                var blogs = context.Riders
                    .FromSql("SELECT * FROM Riders")
                    .ToList();
            }
        }
    }

    class BloggingContext : DbContext
    {
        public DbSet<Rider> Riders { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            var converter = new EnumToStringConverter<EquineBeast>();

            modelBuilder
                .Entity<Rider>()
                .Property(e => e.Mount)
                .HasConversion(converter);
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySQL(
                @"server=localhost;Database=data1;Uid=root;Pwd=password");
        }
    }

    public class Rider
    {
        public int Id { get; set; }
        public EquineBeast Mount { get; set; }
    }

    public enum EquineBeast
    {
        Donkey,
        Mule,
        Horse,
        Unicorn
    }

    public abstract class BlogBase
    {
        public int BlogId { get; set; }
    }

    public class Blog : BlogBase
    {
        public string Url { get; set; }
    }

    public class RssBlog : BlogBase
    {
        public string Url { get; set; }
    }
}Code language: HTML, XML (xml)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注