原始 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)