ASP.NETMVC中的数据库上下文和返回动态结果集在MVC4和EF5中,我想运行动态查询。varreturndata=Context.Database.SqlQuery(Type,strsql,null);我不知道,它将返回并命名多少个字段。在这个结果中,我想制作将显示在视图上的表结构。问题:我应该传递什么类型?我的查询返回以下结果:Field1、Field2、Field3、Field4、Field5ROW1...Row2..感谢您的任何建议。您可以使用原始SQL查询,因为EF不支持:privatestaticIEnumerableRead(DbDataReaderreader){while(reader.Read()){varvalues=newList();for(inti=0;ithen:publicActionResultIndex(){使用(varctx=newUsersContext())使用(varcmd=ctx.Database.Connection.CreateCommand()){ctx.Database.Connection.Open();cmd.CommandText="SELECT*FROMUserProfile";using(varreader=cmd.ExecuteReader()){varmodel=Read(reader).ToList();returnView(model);}}}最后在你的视图中:@modelIEnumerable@foreach(varrowinModel){@foreach(varcolumninrow){@column}}此方法将数据从SQL选择(带有参数)加载到行列表中,其中每一行都是一个字典列(键是列名)。privatestaticList>LoadData(stringsqlSelect,paramsobject[]sqlParameters){vartable=newList>();使用(varctx=newDbEntities()){ctx.Database.Connection.Open();使用(varcmd=ctx.Database.Connection.CreateCommand()){cmd.CommandText=sqlSelect;foreach(sqlParameters中的var参数)cmd.Parameters.Add(param);使用(varreader=cmd.ExecuteReader()){while(reader.Read()){varrow=newDictionary();for(inti=0;i最后我所做的是使用“Mortalus”和ExpandoObject对象建议的TypeBuilder选项。它现在几乎没有性能开销。来自“Mortalus”Typebuilder代码的答案然后根据我的代码制作代码要求如下。List>expandolist=newList>();foreach(variteminreturndata){IDictionaryexpando=newExpandoObject();foreach(PropertyDescriptorpropertyDescriptorinTypeDescriptor.GetProperties(item)){varobj=propertyDescriptor.GetValue(item);expando.Add(propertyDescriptor.Name,obj);}expandolist.Add(newDictionary(expando));}returnexpandolist;现在,我有了“Dictionary”对象。使用它,您可以轻松地在设计时工作,而不是等到运行时才使用“动态”对象。在不知道返回类型的情况下,我认为您可能会失败。如果你知道它可能属于哪种模式,你可以在界面上使用一些try{}catch(){}来匹配那些动态查询的参数,但这可能看起来有点痛苦。不幸的是,EF不会具体化对象,除非它知道它们的类型。如果这对您来说确实有必要,我认为您最好的选择是回到ADO.NET和DataTable。也由DarinDimitrov发布,但它返回数据表;adapter.SelectCommand.CommandText=queryText;如果(参数!=null)adapter.SelectCommand.Parameters.AddRange(参数);DataTable表=newDataTable();适配器。填充(表格);返回表;}}使用SqlParameter[]parameters=new[]{newSqlParameter("date_from",dateFrom)};DataTabletab=QueryToTable(newEntities(),"Select*FromSomeTableWhereADate>=@date_from",parameters);MSSQLServer示例我最近偶然发现了这个示例:http://www.markzhou.com/blog/post/2011/06/02/Use-dynamic-type-in??-Entity-Framework-41-SqlQuery()-method.aspx我还没有时间自己测试它,但似乎可以通过一些额外的工作来构建动态类型。简而言之,您需要执行以下操作:TypeBuilderbuilder=Program.CreateTypeBuilder("MyDynamicAssembly","MyModule","MyType");Program.CreateAutoImplementedProperty(builder,"name",typeof(string));Program.CreateAutoImplementedProperty(builder,"type",typeof(string));Program.CreateAutoImplementedProperty(builder,"id",typeof(int));输入resultType=builder.CreateType();动态查询结果=context.Database.SqlQuery(resultType,"SELECT*FROMsys.sysobjects");TypeBuilder在我所附的帖子中有详细描述。在PetrVoborník的回答DynamicQuery中,我添加了ResultSet的动态插入,我的应用程序对整个数据库的所有表进行动态查询,一次一个块,然后使用AlwaysEncrypted将动态结果插入远程数据库(此处省略)。传递sb命令和参数对象。以上就是C#学习教程:ASP.NETMVC中的数据库上下文和动态结果集的返回。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注---publicvoidStoreData(DbContextdbContext,DictionarycolumnInfo,List>multiInsertObj,stringtableName){_ctx=dbContext;_columnInfo=columnInfo;varsb=newStringBuilder();,GetParamsObject(columnInfo,multiInsertObj));}privatestaticStringBuilderBuildSqlCommand(stringtableName,DictionaryvariableInfo,intvariableCount){//构建sql命令varsb=newStringBuilder();sb.Append("INSERTINTOdbo."+tableName+"(");foreach(varvariableinvariableInfo){sb.Append(variable.Key);sb.Append(",");}sb.Append("SystemNumber,");-2,2).Append(")VALUES");for(vari=0;icolumnInfo,List>multiInsertObj){varvariableCount=multiInsertObj.Count;varrowCount=multiInsertObj[0].Keys.Count;varobjectLength=(rowCount+1)*变量计数;varvariableDataTypes=columnInfo.Values.ToList();varparamObj=新对象[objectLength];变量j=0;变种我=0;foreach(multiInsertObj中的var行){vark=0;foreach(vardatainrow){varsb=newStringBuilder();sb.Append("@");sb.Append(data.Key);sb.Append("_"+i);paramObj[j]=newSqlParameter(sb.ToString(),SetSqlDataType(variableDataTypes[k])){Direction=Input,Value=data.Value};j++;k++;}paramObj[j]=newSqlParameter(("@SystemNumber"+"_"+i),SetSqlDataType("int")){Direction=Input,Value=_systemNumber};我++;j++;}返回参数对象;}privatestaticvoidExecuteSqlCommand(StringBuildersb,paramsobject[]sqlParameters){使用(_ctx){_ctx.Database.Connection.Open();使用(varcmd=_ctx.Database.Connection.CreateCommand()){cmd.CommandText=sb.ToString();foreach(sqlParameters中的var参数)cmd.Parameters.Add(param);尝试{cmd.ExecuteNonQuery();}catch(Exceptione){Console.WriteLine(e);扔;}}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
