撈取DB資料時,如果是單一資料來源的話,直接使用EF Core是很方便。但更多時候資料來源是多張表單,Join完之後又要Group By,好了之後再把結果拿去Join其他表,或是再做子查詢。像這種時候如果沒有寫成View而是直接用Lambda或是LinQ語法來兜的話,實在是寫得很痛苦。以我來說,只要是查詢語法比較複雜的話我都習慣直接下SQL語法,再用自定義類別來接查詢結果。
記得以前在.Net Framework的時候,做法好像沒有這麼複雜,.Net Core會比較複雜一點,以下是使用PostgreSQL來實作,但使用MS SQL應該也不會差太多。
另外附上以前.Net Core3使用ADO.Net的方式
Step 1. 先於Model定義自定義類別
public class Object_Test_TakeOutMachines
{
public int ID { get; set; }
public string Name { get; set; }
public string BoxingLocationID { get; set; }
public string PartNumber { get; set; }
public string BoxingName { get; set; }
}
Step 2. 並在Context檔案裡面手動新增一個DbSet以及modelBuilder
public virtual DbSet<Object_Test_TakeOutMachines> Object_Test_TakeOutMachines { get; set; }
modelBuilder.Entity<Object_Test_TakeOutMachines>(entity =>
{
entity.HasNoKey();
});
Step 3. 兜出SQL語法,並透過Context調用剛才建立的自定義類別,並使用FromSqlRaw來送出SQL語法。
using (var db = _caEDB01Context)
{
var sql =
@"
select * from ""MachineStockManagement"".""BoxingLocation"" a
inner join
(
select mbi.""BoxingLocationID"" , mbi.""PartNumber"", mbi.""BoxingName"" , mbi.""BoxingSerial""
from ""MachineStockManagement"".""MachineBoxingInfo"" mbi
) b
on a.""ID"" = b.""BoxingLocationID""
limit 300
";
var data = _caEDB01Context.Object_Test_TakeOutMachines.FromSqlRaw(sql).ToList();
}
Ref:
Entity framework Core Raw SQLQueries with custom model
Entity Framework Core 的 原始 SQL 查詢(Raw SQL Query) - 我與 ASP.NET Core 3 的 30天