3 回答
TA贡献1946条经验 获得超3个赞
过程不能返回表。使用带有表返回值的函数:
CREATE FUNCTION fnGetOrgChart()
RETURNS @rtnTable TABLE
(
---you fields
)
AS
BEGIN
DECLARE @TempTable table (id uniqueidentifier, name nvarchar(255)....)
insert into @myTable
select from your stuff
--This select returns data
insert into @rtnTable
SELECT ID, name FROM @mytable
return
END
请参阅有关带有表结果的函数的 microsoft 文档
然后打电话
var result = context.Database.SqlQuery<vmNewOrgChart>("select * from fnGetOrgChart()");
正如 Tetsuya Yamamoto 所建议的
否则,您必须调用存储来填充临时表,然后从临时表中选择数据并刷新它
注意。您可以轻松地将参数传递给这些函数。为简洁起见省略
TA贡献1848条经验 获得超2个赞
您可以使用此解决方案:
using (var cmd = _db.Database.GetDbConnection().CreateCommand())
{
cmd.CommandText = "dbo.GetCategories"; //sp name
cmd.CommandType = System.Data.CommandType.StoredProcedure;
_db.Database.OpenConnection();
using (var result = cmd.ExecuteReader())
{
if (result.HasRows)
{
var List= MapToList<Category>(result);
}
}
}
public IList<T> MapToList<T>(DbDataReader dr)
{
var objList = new List<T>();
var props = typeof(T).GetRuntimeProperties();
var colMapping = dr.GetColumnSchema()
.Where(x => props.Any(y => y.Name.ToLower() == x.ColumnName.ToLower()))
.ToDictionary(key => key.ColumnName.ToLower());
if (dr.HasRows)
{
while (dr.Read())
{
T obj = Activator.CreateInstance<T>();
foreach (var prop in props)
{
if (colMapping.Any(a => a.Key.ToLower() == prop.Name.ToLower()))
{
var val = dr.GetValue(colMapping[prop.Name.ToLower()].ColumnOrdinal.Value);
prop.SetValue(obj, val == DBNull.Value ? null : val);
}
}
objList.Add(obj);
}
}
return objList;
}
TA贡献1860条经验 获得超8个赞
到目前为止谢谢大家
谢谢你,这看起来更接近工作了。当我使用代码时
using (_context)
{
using (var cmd = _context.Database.GetDbConnection().CreateCommand())
{
cmd.CommandText = "exec uspGetOrgChart";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
var personIdParam = cmd.CreateParameter();
personIdParam.ParameterName = "ContactID";
personIdParam.Value = id;
cmd.Parameters.Add(personIdParam);
_context.Database.OpenConnection();
using (var result = cmd.ExecuteReader())
{
if (result.HasRows)
{
// do something with results
}
}
}
}
我收到一条错误消息,无法从这一行找到存储过程,该过程肯定在那里并且可以正常工作
(var result = cmd.ExecuteReader())
我认为这是因为代码正在关闭并打开第二个连接,所以我注释掉了这一行
_context.Database.OpenConnection();
这导致连接未打开的错误。
我当前的上下文被称为
_Context
并且正在整个应用程序的其余部分使用,我是否真的必须创建一个全新的上下文和连接才能运行该过程。
- 3 回答
- 0 关注
- 133 浏览
添加回答
举报