给定一个名称,我需要检查我们的 EDMX 中是否存在具有该名称的存储过程,然后使用其参数运行它。
要调用的存储过程由 context.Database.SqlQuery 找到,查询的参数通过 context.GetQueryParameters(string QueryName) 运行已知的存储过程来找到。
我留下了一个存储过程名称,它是 SQL 参数名称和类型。
预先感谢您的帮助!这一直在杀死我...
给定一个名称,我需要检查我们的 EDMX 中是否存在具有该名称的存储过程,然后使用其参数运行它。
要调用的存储过程由 context.Database.SqlQuery 找到,查询的参数通过 context.GetQueryParameters(string QueryName) 运行已知的存储过程来找到。
我留下了一个存储过程名称,它是 SQL 参数名称和类型。
预先感谢您的帮助!这一直在杀死我...
很难准确猜出您使用它的目的是什么,但根据您使用 GetQueryParameters 作为过程名称,我猜测是否适用于不同的查询/搜索。
如果这些都返回相同的类型(搜索结果)并且您想在 EF 中执行此操作的原因是强类型,您可以执行以下操作:(示例在 EF5 和 LinqPad 中使用测试上下文)
using (var context = new TestEntities())
{
string procname = "GetPrograms";
// context has method GetPrograms(int? id)
// Method1 - use the method on the context
// This won't work dynamically
IEnumerable<GetPrograms_Result> result1 = context.GetPrograms(4);
result1.Dump("Method1");
// Method2 - use reflection to get and use the method on the context
// Building your parameters needs to be in the order they are on the method
// This gets you an IEnumerable, but not a strongly typed one
MethodInfo method = context.GetType().GetMethod(procname);
method.GetParameters();
List<object> parameters = new List<object>();
parameters.Add(4);
IEnumerable result2 = (IEnumerable) method.Invoke(context,parameters.ToArray());
result2.Dump("Method2");
// Method3 - make a SqlQuery call on a common return type, passing a dynamic list
// of SqlParameters. This return type can be but dows not need to be an Entity type
var argList = new List<SqlParameter>();
argList.Add(new SqlParameter("@id",4));
object[] prm = argList.ToArray();
var csv = String.Join(",",argList.Select (l => l.ParameterName));
IEnumerable<GetPrograms_Result> result3 = context.Database.SqlQuery<GetPrograms_Result>("exec " + procname + " " + csv ,prm);
result3.Dump("Method3");
}