【发布时间】:2013-06-18 08:43:44
【问题描述】:
如何处理在实体框架中返回不同输出的存储过程。 例如,在 sp 上,有 if 条件和 else 条件。 if 条件返回整数,else 条件返回数据表。如何在 vs 中使用实体框架来处理这个问题。 请指教。
【问题讨论】:
-
是的,这在 ef 现在是不可能的。我尝试了很多。
标签: c# asp.net-mvc entity-framework stored-procedures
如何处理在实体框架中返回不同输出的存储过程。 例如,在 sp 上,有 if 条件和 else 条件。 if 条件返回整数,else 条件返回数据表。如何在 vs 中使用实体框架来处理这个问题。 请指教。
【问题讨论】:
标签: c# asp.net-mvc entity-framework stored-procedures
从 EF 4.1 开始,这是可能的。 唯一的要求是知道 SP 在每种情况下将返回什么。
在我的示例中,我使用
DbContext.Database.SqlQuery<TElement>(string sql, params object[] parameters)
此泛型方法将您希望用于实现的类型作为泛型参数。它还将您想要执行的 SQL 表达式作为参数,连同它的参数作为参数数组。
简化SP(无输入参数)用法是:
var res = ctx.Database.SqlQuery<MyResultType1>("dbo.MyStoredProcedure");
foreach (var r in res)
{
System.Console.Out.WriteLine(
"col1:{0}; col2:{1}; col3={2}",
r.Col1,
r.Col2,
r.Col3);
}
因此,您可以执行以下操作:
IEnumerable res
if(...your logic...)
{
res = ctx.Database.SqlQuery<MyResultType1>(...your SP call...);
}
else
{
res = ctx.Database.SqlQuery<MyResultType2>(...your SP call...);
}
这样您将按照您想要的方式使用 SP 输出结果集填充您的集合。
【讨论】:
单击从数据库中更新模型选择您的存储过程并确保它的过程已添加到函数导入(模型浏览器)中
您可以从编辑函数导入窗口更改返回值
然后执行db.myProcedure();
【讨论】:
例如: 只需拖放您的存储过程,然后
db.procedure(element1, element2);
db.SubmitChanges();
【讨论】:
Ef4 不支持具有不同类型的多个返回的存储过程。我们可以通过 sql 代码直接调用 Sp 来完成,也可以在 linq 中完成 schema。
否则我们需要使用 EF 4.1 及更高版本。
【讨论】: