反射 EF SqlQuery 返回匿名类型
来源:互联网 发布:手机怎么切换软件 编辑:程序博客网 时间:2024/06/10 06:33
//var x = DynamicSqlQuery.DynamicSqlQueryMethod(db.Database, sql, null).ToListAsync(); //TypeBuilder builder = DynamicSqlQuery.CreateTypeBuilder("MyDynamicAssembly", "MyModule", "MyType"); //DynamicSqlQuery.CreateAutoImplementedProperty(builder, "TodayPay", typeof(int)); //DynamicSqlQuery.CreateAutoImplementedProperty(builder, "MonthPay", typeof(int)); //DynamicSqlQuery.CreateAutoImplementedProperty(builder, "TodayNewAgent", typeof(int)); //DynamicSqlQuery.CreateAutoImplementedProperty(builder, "MonthNewAgent", typeof(int)); //DynamicSqlQuery.CreateAutoImplementedProperty(builder, "TodayNewUser", typeof(int)); //DynamicSqlQuery.CreateAutoImplementedProperty(builder, "MonthNewUser", typeof(int)); //DynamicSqlQuery.CreateAutoImplementedProperty(builder, "TotalUser", typeof(int)); //Type resultType = builder.CreateType(); //var queryResult = db.Database.SqlQuery(resultType, sql).ToListAsync(); //var n=queryResult.Result.FirstOrDefault();
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using XLShouYou.Biz.Model;using XLShouYou.Biz.Service;using XLShouYou.Biz.Utilities;using System.Data.Entity;using System.Collections;using System.Reflection.Emit;using System.Reflection;namespace XLShouYou.Biz{ public static class DynamicSqlQuery { public static System.Data.Entity.Infrastructure.DbRawSqlQuery DynamicSqlQueryMethod(Database database, string sql, params object[] parameters) { TypeBuilder builder = CreateTypeBuilder( "MyDynamicAssembly", "MyDynamicModule", "MyDynamicType"); using (System.Data.IDbCommand command = database.Connection.CreateCommand()) { try { database.Connection.Open(); command.CommandText = sql; command.CommandTimeout = command.Connection.ConnectionTimeout; //foreach (var param in parameters) //{ // command.Parameters.Add(param); //} using (System.Data.IDataReader reader = command.ExecuteReader()) { var schema = reader.GetSchemaTable(); foreach (System.Data.DataRow row in schema.Rows) { string name = (string)row["ColumnName"]; //var a=row.ItemArray.Select(d=>d.) Type type = (Type)row["DataType"]; if (type != typeof(string) && (bool)row.ItemArray[schema.Columns.IndexOf("AllowDbNull")]) { type = typeof(Nullable<>).MakeGenericType(type); } CreateAutoImplementedProperty(builder, name, type); } } } finally { database.Connection.Close(); command.Parameters.Clear(); } } Type resultType = builder.CreateType(); return database.SqlQuery(resultType, sql); //return database.SqlQuery(resultType, sql, parameters); } public static TypeBuilder CreateTypeBuilder(string assemblyName, string moduleName, string typeName) { TypeBuilder typeBuilder = AppDomain .CurrentDomain .DefineDynamicAssembly(new AssemblyName(assemblyName), AssemblyBuilderAccess.Run) .DefineDynamicModule(moduleName) .DefineType(typeName, TypeAttributes.Public); typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); return typeBuilder; } public static void CreateAutoImplementedProperty(TypeBuilder builder, string propertyName, Type propertyType) { const string PrivateFieldPrefix = "m_"; const string GetterPrefix = "get_"; const string SetterPrefix = "set_"; // Generate the field. FieldBuilder fieldBuilder = builder.DefineField( string.Concat(PrivateFieldPrefix, propertyName), propertyType, FieldAttributes.Private); // Generate the property PropertyBuilder propertyBuilder = builder.DefineProperty( propertyName, System.Reflection.PropertyAttributes.HasDefault, propertyType, null); // Property getter and setter attributes. MethodAttributes propertyMethodAttributes = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig; // Define the getter method. MethodBuilder getterMethod = builder.DefineMethod( string.Concat(GetterPrefix, propertyName), propertyMethodAttributes, propertyType, Type.EmptyTypes); // Emit the IL code. // ldarg.0 // ldfld,_field // ret ILGenerator getterILCode = getterMethod.GetILGenerator(); getterILCode.Emit(OpCodes.Ldarg_0); getterILCode.Emit(OpCodes.Ldfld, fieldBuilder); getterILCode.Emit(OpCodes.Ret); // Define the setter method. MethodBuilder setterMethod = builder.DefineMethod( string.Concat(SetterPrefix, propertyName), propertyMethodAttributes, null, new Type[] { propertyType }); // Emit the IL code. // ldarg.0 // ldarg.1 // stfld,_field // ret ILGenerator setterILCode = setterMethod.GetILGenerator(); setterILCode.Emit(OpCodes.Ldarg_0); setterILCode.Emit(OpCodes.Ldarg_1); setterILCode.Emit(OpCodes.Stfld, fieldBuilder); setterILCode.Emit(OpCodes.Ret); propertyBuilder.SetGetMethod(getterMethod); propertyBuilder.SetSetMethod(setterMethod); } }}
参考文章:
http://stackoverflow.com/questions/26749429/anonymous-type-result-from-sql-query-execution-entity-framework
http://www.codeproject.com/Articles/206416/Use-dynamic-type-in-Entity-Framework-SqlQuery
http://www.cnblogs.com/xishuai/p/entityframework_async_await_SaveChangesAsync_ToListAsync.html
http://www.cnblogs.com/artech/archive/2007/07/15/818980.html
http://www.cnblogs.com/dudu/p/async_await_parallel.html
http://www.cnblogs.com/lori/p/4142201.html
http://www.cnblogs.com/NanaLich/archive/2013/03/06/implementing-inotifypropertychanged-via-typebuilder.html
0 0
- 反射 EF SqlQuery 返回匿名类型
- EF中反射不确定类型。
- SQLQuery 查询Oracle char类型返回一个字符问题
- SQLQuery 查询Oracle char类型返回一个字符有关问题
- EF的SqlQuery和EntitySql
- EF.使用反射解决实体类型转换问题
- Hibernate使用SQLQuery返回实体
- 通过反射获取匿名类型的属性和属性值
- 通过反射获取方法返回的类型
- SQLQuery
- SqlQuery
- Hibernate SQLQuery 返回结果转成Map
- Hibernate SQLQuery 返回List<Bean>结果集
- Hibernate使用SQLQuery返回List<Map>
- java SqlQuery返回数据太大的问题
- 反射获取属性,方法的类型及返回类型
- 匿名类型
- 匿名类型
- Web前端面试指导(四):面试前准备-有备而去百战百胜
- RCurl包学习笔记
- Android环境常见的问题
- Caffe学习笔记(三)——Matlab接口
- 1323: 算法2-1:集合union
- 反射 EF SqlQuery 返回匿名类型
- leetcode-36-valid sudoku
- Opencv246+vs2012生成不依赖编译环境的exe文件
- GCD线程间通信
- requireJs进行模块化开发
- 编写脚本和批处理
- TTNavigationBar-alpha 导航栏隐藏渐变
- 关于指针作为函数参数的一些想法
- 通过 Hibernate 实现 JPA 对象关系模型之继承映射策略