1. 程式人生 > >DataTable 轉 匿名類 陣列物件==>可進行Lamda表示式,Link表示式,會有屬性的智慧提示

DataTable 轉 匿名類 陣列物件==>可進行Lamda表示式,Link表示式,會有屬性的智慧提示

由於專案不太適合使用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();
        }

其實看得見,用匿名類替代了實體類,相比於新建一個實體類 還是要方便許多,維護起來的話,方法在哪,就去哪維護,感覺還是有一些進步的