Entity Framework Raw SQL Query


  1. 說明
    1. 實體對應的查詢
    2. 執行不需要回應的查詢
    3. 非實體對應的回應
    4. 從 StoredProcedures 取得回應
  2. 參考資料

筆記如何在 EntityFramework 仍使用手工設計的 TSQL 進行資料查詢。

logo

說明

using System;
using System.Collections.Generic;
using System.Linq;

var dbContext = new NorthwindEntities();
IList<Employees> emps = dbContext.Employees.ToList();

foreach (var emp in emps)
{
    Console.WriteLine($"{emp.EmployeeID} {emp.FirstName} {emp.LastName}");
}

實體對應的查詢

IList<Employees> emps = 
  dbContext.Employees.SqlQuery("SELECT TOP(3) * FROM Employees").ToList();

foreach (var emp in emps)
{
    Console.WriteLine($"{emp.EmployeeID} {emp.FirstName} {emp.LastName}");
}

執行不需要回應的查詢

dbContext.Database.ExecuteSqlCommand("SELECT * FROM Employees");

非實體對應的回應

IList<string> EmpNameList =
  dbContext.Database.SqlQuery<string>("SELECT FirstName FROM Employees").ToList();

foreach (var name in EmpNameList)
{
    Console.WriteLine(name);
}

從 StoredProcedures 取得回應

可以藉由Database.SqlQuery 泛型方法的方式取得 StoredProcedures 的回應,如果回應的實體非資料表對照到類別的實體,則必須另外定義類別,必須注意類別的各欄位名稱必須與 Stored Procedures 同名。這個技巧同樣可以應用在非實體對應的回應的情境,例如只需要既有實體部分屬性的情況。

var query = dbContext.Database.
  SqlQuery<ExpensiveProduct>("EXEC [dbo].[Ten Most Expensive Products]").ToListAsync();

await Task.WhenAll(query);

foreach (var item in query.Result)
{
    Console.WriteLine($"{item.TenMostExpensiveProducts} \n {item.UnitPrice}");
}

ExpensiveProduct.cs

public class ExpensiveProduct
{
    public string TenMostExpensiveProducts { get; set; }
    public decimal UnitPrice { get; set; }
}

參考資料

Raw SQL Queries (EF6) | learn.microsoft