DataTable 轉 匿名類 陣列物件==>可進行Lamda表示式,Link表示式,會有屬性的智慧提示
阿新 • • 發佈:2018-11-10
由於專案不太適合使用EF ,使用了原生的 ADO.NET ,在得到DataTable 後大多數時候都是直接序列化為JSON格式字串就返回前端了,在一些情況下,又需要對結果集做進一步的處理,
(EF中動態生成的實體類,也不能完全滿足要求,隨便一個聯查得到的結果不在程式碼中處理還好,一旦需要在程式碼中在處理一遍,這個聯查結果集結構的實體類你是加還是不加呢?) ===>其實實體類維護起來還是好煩的
想要 DataTable轉換為 類似 List<T> 可進行 Lamda 表示式的操作和 Link表示式那就算完美了
Json.Net 中有一個 Jobject 的 類 一個類似動態 dynasmic 的東西,轉換為這玩意,不爽,不能使用Lamada 和Link 沒有智慧提示
在 Json.Net 中看到 一個函式
public static T DeserializeAnonymousType<T>(string value, T anonymousTypeObject);
通過 這個函式就可以得到 我想要的完美物件, 不過中間步驟就多了一步,需要先將 DataTable序列化為字串 ,再反序列化得到 匿名物件 使用方法如下 :
public void Test() { DataTable dt = new DataTable(); dt.Columns.Add("Age", Type.GetType("System.Int32")); dt.Columns.Add("Name", Type.GetType("System.String")); dt.Columns.Add("Sex", Type.GetType("System.String")); dt.Columns.Add("IsMarry", Type.GetType("System.Boolean")); for (int i = 0; i < 4; i++) { DataRow dr = dt.NewRow(); dr["Age"] = i + 1; dr["Name"] = "Name" + i; dr["Sex"] = i % 2 == 0 ? "男" : "女"; dr["IsMarry"] = i % 2 > 0 ? true : false; dt.Rows.Add(dr); } var strJson = JsonConvert.SerializeObject(dt); Console.WriteLine(strJson); var definition = new[] { new { Age = 1, Name = string.Empty, Sex = string.Empty, IsMarry = true } }; var person1 = JsonConvert.DeserializeAnonymousType(strJson, definition); var womanList = from x in person1 where x.Sex == "女" select x; var littleList = person1.Where(x => x.Age == 1); Console.ReadKey(); }
其實看得見,用匿名類替代了實體類,相比於新建一個實體類 還是要方便許多,維護起來的話,方法在哪,就去哪維護,感覺還是有一些進步的