.Net Core使用FromSqlRaw()直接下SQL撈取資料,並存放到自定義類別

撈取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天