C# LINQ to Entities 與 SQL 語法使用技巧

January 6, 2021

本文是撰寫 ASP.NET MVC 專案時,留下的一些筆記。

以 LINQ to Entities 或 SQL 語法查詢資料

  • 撰寫 LINQ to Entities 的基礎 CRUD 語法時,除了 Read 方法 (dbContext.Table.Find()) 以外,基本上是以特定語法搭配 dbContext.SaveChanges() 儲存資料庫內容。
  • 需要輸入原始的 MS-SQL 語法查詢時,可使用 dbContext.Table.SqlQuery("SQL Command") ,這個方法會回傳 Table class 的實體物件集合:
 using (var context = new BloggingContext())
{
    var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList();
}
  • 查詢以外的寫入、更新資料庫等作業,可使用Database.ExecuteSqlCommand() 原生 SQL 語法執行資料庫的寫入指令。(Database.SqlQuery() 可用原生 SQL 語法查詢 (SELECT) 資料)

參考資料

SQL 語法的查詢條件 (中文、CONCAT、大小寫)

  • SQL 下查詢中文字串無資料、寫入中文變成問號 ? 時,可透過加入 N 在查詢字串前面,告知 SQL 的查詢語法需轉換為 Unicode 的形式。
  • 可使用 CONCAT 語法 (MS-SQL 語法為 + 號) 同時查詢多欄位的字串。
  • MS-SQL 的查詢條件預設是沒有大小寫區別的,如果需要在查詢時區分大小寫的查詢結果,可以嘗試 Latin1_General_CI_AS 定序 (Collation):

範例與參考資料,已收錄在拙作 SQL WHERE 語法的查詢條件 當中!

SQL 重複使用相同的表格來源,並設定不同的查詢條件

  • 可以用以下方法查詢同一個欄位包含兩個不一樣值的紀錄 (Record):
SELECT
    a.transporter,
    b1.warehouseName as warehouse1,
    b2.warehouseName as warehouse2
FROM
    transportation a,
    warehouse b1,
    warehouse b2
WHERE
        a.warehouseId1 = b1.warehouseId
    AND
        a.warehouseId2 = b2.warehouseId

Entity Framework 與專案註記

  • DataDirectory 用以替代應用程式目錄,在 ClickOnce 應用程式下則為產生的特定資料目錄。
  • 以 Enttiy 建立資料庫後,需使用 “新增連接” 功能建立連線。

參考資料

Entity Framework 的使用技巧

  • 欲查詢多欄位的資料,先根據查詢的資料建立符合的類別,再使用以下語法:
    var res = dbContext.Database.SqlQuery<TestEntity>("Select * from dbo.MyView").ToList();
    
  • 增加 Entity Framework 讀寫效率的方法:1. 關閉自動偵測追蹤 2. 使用 AddRange() 一次加入所有資料再 SaveChange() 代替 Add() 一筆一筆加入資料。

其它