由于项目不太适合使用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();
}
其实看得见,用匿名类替代了实体类,相比于新建一个实体类 还是要方便许多,维护起来的话,方法在哪,就去哪维护,感觉还是有一些进步的