使用 Entity Framework 计算列通过存储过程获取多个结果集

Get multiple result set with stored procedure using Entity Framework calculated column

我想使用 Entity Framework 从存储过程中获取多个结果集。结果 table 获取成功,但是当我想获取 Balance 列时,它不能,任何帮助将不胜感激。

谢谢

public ViewModel GetTwoResultSetsForUserId(string Date, string FromDate, string ToDate, int userId)
{
    using (var db = new CuumiEntities())
    {
        // Create a SQL command and add parameter
        var cmd = db.Database.Connection.CreateCommand();
        cmd.CommandText = "getTransactionDatewisetesting";
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add(new SqlParameter("@Date", Date));
        cmd.Parameters.Add(new SqlParameter("@FromDate", FromDate));
        cmd.Parameters.Add(new SqlParameter("@ToDate", ToDate));
        cmd.Parameters.Add(new SqlParameter("@UserId", userId));

        // execute your command
        db.Database.Connection.Open();
        var reader = cmd.ExecuteReader();
        double Balance = reader.GetDouble(0);

        var transactions = ((IObjectContextAdapter)db)
                                .ObjectContext
                                .Translate<transaction>(reader)
                                .ToList();

        reader.NextResult();

        var Expenses = ((IObjectContextAdapter)db)
                        .ObjectContext
                        .Translate<spendingClass>(reader, "spendings", MergeOption.AppendOnly).ToList();

        var balance = ((IObjectContextAdapter)db).ObjectContext.Translate<PrevBalance>(reader);

        return new ViewModel
               {
                   transactions = transactions,
                   Expenses = Expenses,
                   Balance = Balance
                };
    }
}

这是我想要的模型 return

这是我的存储过程结果:

SQL Server 和.NET Framework 基于不同的类型系统,因此在.NET 端读取数据时需要谨慎使用数据映射。

在这里您可以找到 SQL Server 和 .NET Framework https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings

之间的类型映射列表或等效类型

在您的问题中,不清楚 SQL 侧的 Balance 列的类型是什么,或者您的存储过程是什么类型。在您的代码中,您试图将 Balance 列读取为 Double,这就是您获得 Specified cast is not valid in sql server 的位置。根据微软的文档(link shared above),在SQL服务器端声明列类型必须是Float,这样在.NET端你可以读取它作为Double类型。

当您收到类型转换错误时,我猜您正在从数据库返回非 Float 值。作为解决方案,您可以更新存储过程以将 Balance 转换为 Float 类型。

示例用法:SELECT CAST(Balance AS FLOAT)

最后,作为一个建议,用 using 语句包装你的 ConnectionReader 对象,这样在执行结束时,它们就会被处理掉,而不是保持打开状态连接,这最终会导致所有池连接都在使用异常。