EF动态类型 - SqlParameter已包含在另一个SqlParameterCollection中 [英] EF Dynamic type - The SqlParameter is already contained by another SqlParameterCollection

查看:68
本文介绍了EF动态类型 - SqlParameter已包含在另一个SqlParameterCollection中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个存储过程,它提供动态结果集



(例如,1。storedProcedureNameXX 4 - sql server结果 可能是5列)

(例如,storedProcedureNameXX 1 - sql server result 可能是3列)



假设我在类型构建器中添加了动态列:TypeBuilder
builder = CreateTypeBuilder(" MyDynamicAssembly"," MyModule"," MyType")
< br style ="color:#242729; font-family:Arial,'Helvetica Neue',Helvetica,sans-serif; font-size:15px">
// Todo:获取动态列名

TypeBuilder builder = CreateTypeBuilder(" MyDynamicAssembly",
" MyModule"," MyType")< br>


// Todo:获取动态列名

CreateAutoImplementedProperty(builder," column1",typeof(string));

CreateAutoImplementedProperty(builder," column2",typeof(string));

CreateAutoImplementedProperty(builder," column3",typeof(string));



类型resultType = builder.CreateType();

   var parameters = new List< SqlParameter>();

   parameters.Add(new SqlParameter(" parm1",1));

var   p1  =
entity.Database.SqlQuery(resultType," exec storedProcedureNameXX @ parm1",parameters.ToArray());


P1变量错误:

" SqlParameter已被另一个SqlParameterCollection包含"
无法放置ToList()


//添加了使用的方法

private static TypeBuilder createTypeBuilder(string assemblyName,string
moduleName,string typeName) 




TypeBuilder typeBuilder = AppDomain.CurrentDomain

.defineDynamicAssembly(new AssemblyName(assemblyName),AssemblyBuilderAccess.Run)

.definitionDynamicModule(moduleName)

.DefineType(typeName,TypeAttributes.Public); 

typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); 

return typeBuilder; 



private static void createAutoImplementedProperty(TypeBuilder builder,
string propertyName,Type propertyType){const string PrivateFieldPrefix =" m_" ;; const string GetterPrefix =" get_" ;; const string SetterPrefix =" ; set_" ;;




  //生成字段。

     FieldBuilder fieldBuilder = builder.DefineField(

       string.Concat(PrivateFieldPrefix,
propertyName),


          
    propertyType,FieldAttributes.Private);




     //生成属性

     PropertyBuilder propertyBuilder = builder.DefineProperty(

       propertyName,System.Reflection.PropertyAttributes.HasDefault,
propertyType,null);




     //属性getter和setter属性。

     MethodAttributes propertyMethodAttributes
=


       MethodAttributes.Public |
MethodAttributes.SpecialName |


       MethodAttributes.HideBySig;



     //定义getter方法。

     MethodBuilder getterMethod = builder.DefineMethod(

       string.Concat(GetterPrefix,
propertyName),


       propertyMethodAttributes,
propertyType,Type.EmptyTypes);




     //发送IL代码。

     // ldarg.0

     // ldfld,_field

     // ret

     ILGenerator getterILCode = getterMethod.GetILGenerator();

     getterILCode.Emit(OpCodes.Ldarg_0);

     getterILCode.Emit(OpCodes.Ldfld,fieldBuilder);

     getterILCode.Emit(OpCodes.Ret);



     //定义setter方法。

     MethodBuilder setterMethod = builder.DefineMethod(

       string.Concat(SetterPrefix,
propertyName),


       propertyMethodAttributes,
null,new Type [] {propertyType});




     //发送IL代码。

     // 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);

  } 

  //生成字段。

     FieldBuilder fieldBuilder = builder.DefineField(

       string.Concat(PrivateFieldPrefix,
propertyName),


          
    propertyType,FieldAttributes.Private);




     //生成属性

     PropertyBuilder propertyBuilder = builder.DefineProperty(

       propertyName,System.Reflection.PropertyAttributes.HasDefault,
propertyType,null);




     //属性getter和setter属性。

     MethodAttributes propertyMethodAttributes
=


       MethodAttributes.Public |
MethodAttributes.SpecialName |


       MethodAttributes.HideBySig;



     //定义getter方法。

     MethodBuilder getterMethod = builder.DefineMethod(

       string.Concat(GetterPrefix,
propertyName),


       propertyMethodAttributes,
propertyType,Type.EmptyTypes);




     //发送IL代码。

     // ldarg.0

     // ldfld,_field

     // ret

     ILGenerator getterILCode = getterMethod.GetILGenerator();

     getterILCode.Emit(OpCodes.Ldarg_0);

     getterILCode.Emit(OpCodes.Ldfld,fieldBuilder);

     getterILCode.Emit(OpCodes.Ret);



     //定义setter方法。

     MethodBuilder setterMethod = builder.DefineMethod(

       string.Concat(SetterPrefix,
propertyName),


       propertyMethodAttributes,
null,new Type [] {propertyType});




     //发送IL代码。

     // 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);

  }   


I have a stored procedure which gives a dynamic result set

(Eg1. storedProcedureNameXX 4 - sql server result  may be 5 columns)
(Eg2. storedProcedureNameXX 1 - sql server result  may be 3 columns)

Lets assume i have added the dynamic columns in the Type Builder: TypeBuilder builder = CreateTypeBuilder("MyDynamicAssembly", "MyModule", "MyType")
//Todo:get the dynamic column names
TypeBuilder builder = CreateTypeBuilder("MyDynamicAssembly", "MyModule", "MyType")<br>
//Todo:get the dynamic column names
CreateAutoImplementedProperty(builder, "column1", typeof(string));
CreateAutoImplementedProperty(builder, "column2", typeof(string));
CreateAutoImplementedProperty(builder, "column3", typeof(string));

Type resultType = builder.CreateType();
   var parameters = new List<SqlParameter>();
   parameters.Add(new SqlParameter("parm1", 1));
var p1 = entity.Database.SqlQuery(resultType, "exec storedProcedureNameXX @parm1", parameters.ToArray());
Error in P1 variable:
"The SqlParameter is already contained by another SqlParameterCollection" Unable to place ToList()
//Added methods used
private 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; 

private 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);
    } 
 // 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);
    }    








推荐答案

我有一个存储过程,它提供动态结果集



(例如,1。storedProcedureNameXX 4 - sql server result 可能是5列)

(例如,storedProcedureNameXX 1 - sql server result 可能是3列)



假设我在Type Builder中添加了动态列:TypeBuilder builder = CreateTypeBuilder(" MyDynamicAssembly",
" MyModule"," MyType")
< br style ="color:#242729; font-family:Arial,'Helvetica Neue',Helvetica,sans-serif; font-size:15px">
// Todo:获取动态列名

TypeBuilder builder = CreateTypeBuilder(" MyDynamicAssembly"," MyModule"," MyType")< br>

// Todo:获取动态列名

CreateAutoImplementedProperty(builder," column1",typeof(string));

CreateAutoImplementedProperty(builder," column2",typeof(string));

CreateAutoImplementedProperty(builder," column3",typeof(string));



类型resultType = builder.CreateType();

   var parameters = new List< SqlParameter>();

   parameters.Add(new SqlParameter(" parm1",1));



var   p1  =
entity.Database.SqlQuery(resultType," exec storedProcedureNameXX @ parm1",parameters.ToArray());




P1变量错误:

" SqlParameter已被另一个SqlParameterCollection包含"无法放置ToList()





//添加了使用的方法

private static TypeBuilder createTypeBuilder(string assemblyName,string moduleName,string typeName) 



TypeBuilder typeBuilder = AppDomain.CurrentDomain

.defineDynamicAssembly(new AssemblyName(assemblyName),AssemblyBuilderAccess.Run)

.definitionDynamicModule(moduleName)

.DefineType(typeName,TypeAttributes.Public); 

typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); 

return typeBuilder; 



private static void createAutoImplementedProperty(TypeBuilder builder,string propertyName,Type propertyType){const string PrivateFieldPrefix
=" m_" ;; const string GetterPrefix =" get_" ;; const string SetterPrefix =" ; set_" ;;




  //生成字段。

     FieldBuilder fieldBuilder = builder.DefineField(

       string.Concat(PrivateFieldPrefix,propertyName),

              propertyType,FieldAttributes.Private);



     //生成属性

     PropertyBuilder propertyBuilder = builder.DefineProperty(

       propertyName,System.Reflection.PropertyAttributes.HasDefault,propertyType,null);



     //属性getter和setter属性。

     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);

    }    



 // 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);

    }    


I have a stored procedure which gives a dynamic result set

(Eg1. storedProcedureNameXX 4 - sql server result  may be 5 columns)
(Eg2. storedProcedureNameXX 1 - sql server result  may be 3 columns)

Lets assume i have added the dynamic columns in the Type Builder: TypeBuilder builder = CreateTypeBuilder("MyDynamicAssembly", "MyModule", "MyType")
//Todo:get the dynamic column names
TypeBuilder builder = CreateTypeBuilder("MyDynamicAssembly", "MyModule", "MyType")<br>
//Todo:get the dynamic column names
CreateAutoImplementedProperty(builder, "column1", typeof(string));
CreateAutoImplementedProperty(builder, "column2", typeof(string));
CreateAutoImplementedProperty(builder, "column3", typeof(string));

Type resultType = builder.CreateType();
   var parameters = new List<SqlParameter>();
   parameters.Add(new SqlParameter("parm1", 1));

var p1 = entity.Database.SqlQuery(resultType, "exec storedProcedureNameXX @parm1", parameters.ToArray());

Error in P1 variable:
"The SqlParameter is already contained by another SqlParameterCollection" Unable to place ToList()


//Added methods used
private 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; 

private 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);
    }    

 // 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);
    }    





Already tried solutions:

Already tried solutions:


1. var p1 = entity.Database.SqlQuery(resultType, "exec
storedProcedureNameXX @parm1"
,parameters.ToArray()).ToList();


2.  var p1 = entity.Database.SqlQuery(resultType, "exec
storedProcedureNameXX @parm1"
, parameters.Select(=> ((ICloneable)x).Clone()).ToArray()).ToList();





这篇关于EF动态类型 - SqlParameter已包含在另一个SqlParameterCollection中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆