我也在寻找类似的解决方案,但一直没有找到。因此,我结合了 EF、SqlCommand
和 SqlCommandBuilder.DeriveParameters(cmd)
。
public (string sqlText, List<SqlParameter> parameters) PrepareSQL(string sqlText)
{
List<SqlParameter> parameters = new List<SqlParameter>();
using (var conn = new SqlConnection(db.Database.Connection.ConnectionString))
{
using (var cmd = new SqlCommand(sqlText, conn))
{
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
SqlCommandBuilder.DeriveParameters(cmd);
foreach (SqlParameter item in cmd.Parameters)
{
if (item.Direction != ParameterDirection.ReturnValue)
{
sqlText += item.ParameterName + ",";
}
if (item.Direction == ParameterDirection.Output || item.Direction == ParameterDirection.InputOutput)
{
item.Direction = ParameterDirection.Output;
parameters.Add(item);
}
}
sqlText = sqlText.Trim(',');
cmd.Parameters.Clear();
}
}
return (sqlText, parameters);
}
在if语句中,您可以使用item.Direction == ParameterDirection.Input
来表示输入参数。
您可以这样使用:
string sqlText = "Report_Portfolio_Statement_Investor_Wise";
List<SqlParameter> parameters;
(sqlText, parameters) = PrepareSQL(sqlText);
parameters.AddRange(
new List<SqlParameter>()
{
new SqlParameter("@clientCode", clientCode),
new SqlParameter("@reportDate", reportDate),
new SqlParameter("@fromDate", fromDate)
}
);
var data = db.Database.SqlQuery<PortfolioStatementInvestorReportVM>(sqlText, parameters.ToArray()).ToList();