.net core可以執(zhí)行SQL語(yǔ)句,但是只能生成強(qiáng)類型的返回結(jié)果。例如var blogs = context.Blogs.FromSql("SELECT * FROM dbo.Blogs").ToList()。而不允許返回DataSet、DataTable等弱類型??赡苡捎谶@個(gè)原因沒有實(shí)現(xiàn)在.net core中DataTable,然而DataTable還是可能會(huì)用到的。我們這里就有一個(gè)數(shù)據(jù)倉(cāng)庫(kù)的需求,允許用戶自行編寫類似SQL語(yǔ)句,然后執(zhí)行,以表格展示。因?yàn)檎Z(yǔ)句是千變?nèi)f化的,因此我也不知道用戶的語(yǔ)句輸出的是啥,更無法以類型來定義,因此只能采用DataTable方式。
之前.net framework下,可以通過dataadpater很方便的填充datatable,然后將datatable的數(shù)據(jù)推送到客戶端展示。但是.net core下,已經(jīng)沒有DataTable和DataSet,我們只能自行實(shí)現(xiàn)MicroDataTable。
這里我們也按照DataTable的方式,MicroDataTable的列定義為MicroDataColumn,行定義為MicroDataRow。代碼如下:
需要注意的是TotalCount屬性,在分頁(yè)情況下,是指查詢語(yǔ)句在數(shù)據(jù)庫(kù)中查詢出的所有記錄條數(shù),而MicroDataTable的數(shù)據(jù)是當(dāng)前頁(yè)面的記錄。
對(duì)于從數(shù)據(jù)庫(kù)中獲取DataTable的做法,采用類似SqlHelper的方式編寫DbContext的ExecuteDataTable擴(kuò)展方法,傳入SQL語(yǔ)句和SQL語(yǔ)句的參數(shù),生成MicroDataTable:
這個(gè)方法還是需要部分.net framework core的技巧的,流程是根據(jù)SQL和參數(shù)創(chuàng)建原生的SQLCommand,執(zhí)行ExecuteReader方法返回DataReader,再把DataReader填充到MicroDataTable中。注意的是,IConcurrencyDetector在.net core的描述是這樣的:Thi