Entity Framework Core 3.1 入門(七)執行原生SQL語句


此入門教程是記錄下方參考資料視頻的過程,本例基於Entity Framework Core 3.1
開發工具:Visual Studio 2019

參考資料:https://www.bilibili.com/video/BV1xa4y1v7rR

目錄

Entity Framework Core 3.1 入門(一)創建項目

Entity Framework Core 3.1 入門(二)創建數據庫和遷移(Migration)文件

Entity Framework Core 3.1 入門(三)一對一、多對多

Entity Framework Core 3.1 入門(四)增刪改查

Entity Framework Core 3.1 入門(五)關聯數據的添加和查詢

Entity Framework Core 3.1 入門(六)一對一和多對多關系的增刪改查

Entity Framework Core 3.1 入門(七)執行原生SQL語句

Entity Framework Core 3.1 入門(八)在 ASP.NET Core 中配置 Entity Framework Core

創建視圖和存儲過程

EF Core不能直接操作數據庫,所以要創建視圖和存儲過程,需要使用生成的空的Migration文件,將執行的SQL腳本放到Migration文件里,Up()和Down()方法

無主鍵的Entity

  1. .NET Core 3.1 允許無主鍵的Entity
  2. 它們不會被追蹤
  3. 映射到沒有主鍵的Table或View
  4. 查詢時不能使用Find(),因為Find()使用主鍵
public DbSet<PlayerClub> PlayerClubs { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
      //ToView(),參數是視圖名,將DbSet映射到(已存在的)視圖上
      modelBuilder.Entity<PlayerClub>()
            .HasNoKey()
            .ToView("PlayerClubView");
}

原生SQL查詢的要求

  1. 必須返回Entity類型的所以(標量)屬性,(SELECT *)
      也可以寫變量,但是一個不能多一個不能少,不能寫導航屬性
  2. 字段名和Entity的屬性名匹配
  3. 無法包含關聯的數據(SQL語句中)
  4. 只能查詢已知的Entity

原生SQL查詢(方法在DbSet上)

  1. FromSqlRaw("SELECT * ...")
  2. FromSqlRawAsync("SELECT * ...")
    C# 6.0 的插值語法必須使用以下函數才能用
  3. FromSqlInterpolated($"SELECT * WHERE x={var}")
  4. FromSqlInterpolatedAsync($"SELECT * WHERE x={var}")

執行原生SQL查詢語句

public static void Func_26()
{
      using var context = new DemoContext();
      //FromSqlRaw()是DbSet的方法
      //ToList()才會去查數據庫
      var leagues = context.Leagues.FromSqlRaw("SELECT * FROM dbo.Leagues").ToList();

      //條件查詢
      //var clubs = context.Clubs
      //    .FromSqlRaw("SELECT * FROM dbo.Clubs WHERE Id>0")
      //    .Include(x => x.League)
      //    .Include(x => x.Players)
      //        .ThenInclude(x => x.GamePlayers)
      //    .ToList();

      //字符串插值(帶參數SQL語句)
      var clubs = context.Clubs
          .FromSqlInterpolated($"SELECT * FROM dbo.Clubs WHERE Id>{0}").ToList();

      //執行查詢的存儲過程
      //FromSqlRaw()和FromSqlInterpolated()都行,但是返回的字段必須和類匹配
      var data = context.Clubs
          .FromSqlInterpolated($"EXEC dbo.Xxxx WHERE Id>{0}").ToList();
}

執行非查詢類SQL(方法不在DbSet上)

  1. Context.Database.ExecuteSqlRaw()
  2. Context.Database.ExecuteSqlRawAsync()
  3. Context.Database.ExecuteSqlInterpolated()
  4. Context.Database.ExecuteSqlInterpolatedAsync()
  5. 無法用於查詢
  6. 只能返回影響的行數
public static void Func_27()
{
      using var context = new DemoContext();

      //一定要用帶參數SQL語句,防止SQL注入
      var count = context.Database.ExecuteSqlRaw("EXEC dbo.RemoveGamePlayersProcedure {0}", 2);

      count = context.Database.ExecuteSqlInterpolated($"EXEC dbo.RemoveGamePlayersProcedure {2}");
}

執行原生SQL語句 結束


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM