筆記如何在 EntityFramework 仍使用手工設計的 TSQL 進行資料查詢。
說明
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; }
}