Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用实体框架从存储过程获取多个字符串输出_C#_Sql_Entity Framework_Model View Controller - Fatal编程技术网

C# 使用实体框架从存储过程获取多个字符串输出

C# 使用实体框架从存储过程获取多个字符串输出,c#,sql,entity-framework,model-view-controller,C#,Sql,Entity Framework,Model View Controller,以下存储过程显示三个字符串和一个表行结果作为输出。 是否有任何方法可以使用实体框架在mvc视图输出面板上显示所有结果 我可以在下面的代码中看到第一个字符串结果。但是,是否还有其他两个select字符串输出和 表中的行显示结果 private CustomerEntities db = new CustomerEntities(); public ActionResult Index() { var results = db.usp_Cust

以下存储过程显示三个字符串和一个表行结果作为输出。 是否有任何方法可以使用实体框架在mvc视图输出面板上显示所有结果

我可以在下面的代码中看到第一个字符串结果。但是,是否还有其他两个select字符串输出和 表中的行显示结果

private CustomerEntities db = new CustomerEntities();
        public ActionResult Index()
        {
            var results = db.usp_CustomerData("124544", 1500);
            var abc = results.ToList();
            return View();
        }

ALTER PROCEDURE [dbo].[usp_CustomerData]
@CustomerID varchar(6),
@MinsBack int
AS
BEGIN

    DECLARE @Count int
    SET @Count = (SELECT Count(*)
                    FROM Customer WITH (NOLOCK)
                    WHERE CustomerID = @CustomerID AND                       
                          DATEDIFF(mi, ReceivedAt, GETUTCDATE()) < @MinsBack)
    IF (@Count = 1)
        SELECT 'Ok:  1 message in Customer table'
    ELSE
        SELECT 'ERROR:  Expected 1 message in Customer table, but found ' + CONVERT(varchar(3), @Count) + ' messages.'


    SET @Count = (SELECT Count(*)
                    FROM CustomerDetails WITH (NOLOCK)
                    WHERE CustomerID = @CustomerID AND
                          DATEDIFF(mi, LastUpdatedAt, GETDATE()) < @MinsBack)
    IF (@Count = 1)
        SELECT 'Ok:  1 record in CustomerDetails table'
    ELSE
        SELECT 'ERROR:  Expected 1 record in CustomerDetails table, but found ' + CONVERT(varchar(3), @Count) + ' records.'


    SET @Count = (SELECT Count(*)
                    FROM CustomerProduct WITH (NOLOCK)
                    WHERE CustomerID = @CustomerID AND
                          DATEDIFF(mi, LastUpdatedAt, GETDATE()) < @MinsBack)
    IF (@Count = 1)
        SELECT 'Ok:  1 record in CustomerProduct table'
    ELSE
        SELECT 'ERROR:  Expected 1 record in CustomerProduct table, but found ' + CONVERT(varchar(3), @Count) + ' records.'

    SELECT *FROM Customer where customerID = @CustomerID

END

根据建议,您可以在SQL脚本中创建一个临时表,用作临时存储

CREATE TABLE #Results
(
    Message VARCHAR(512)
)
您应该将字符串插入临时表,而不是在每个IF或ELSE中直接选择。 最后,您可以通过以下方式实现让所有插入的字符串返回它们的目标:

SELECT * FROM #Results
要获得客户(就像您在最后所做的那样),您应该触发对数据库的新查询


根据您的情况,您应该考虑用数据上下文查询数据库,而不是通过存储过程查询数据库。

您需要做一些建议,但我总结如下

对于每个结果集,您需要执行reader.NextResult

var someReturnObject = new ResultObject();

using (var context = new LinqPadDbContext(@"Server=localhost\SQLEXPRESS;Database=StackOverflow;Trusted_Connection=True;"))
{
    var cmd = context.Database.Connection.CreateCommand();
    cmd.CommandText = "[dbo].[GetSomeData]";

    try
    {           
        context.Database.Connection.Open();

        var reader = cmd.ExecuteReader();

        var result1 = ((IObjectContextAdapter)context).ObjectContext.Translate<string>(reader);

        someResultObject.Text1 = result1.First();

        //for each extra result, start here
        reader.NextResult();

        var users = ((IObjectContextAdapter)context).ObjectContext.Translate<User>(reader);

        someResultObject.Users = users.Select(x => x);
        //stop here
    }
    finally
    {
        context.Database.Connection.Close();
    }
} 

结合其他答案,只需处理两个输出。