public List GetPostsByCompanyId(int id, int s, int d, int p)
{
string command = @\"select Id,Title,Cities = STUFF(
(SELECT \',
While I am calling on SQL stored proc via EF Core, I like to build an array of SqlParameter to help me mash the SQL with params needed in the FromSql call, like this:
using (var scope = _services.CreateScope())
{
var parameters = new []
{
new SqlParameter("param1", System.Data.SqlDbType.VarChar, 10) { Value = someInboundMethodParam },
new SqlParameter("param2", System.Data.SqlDbType.VarChar, 50) { Value = Environment.UserName },
// etc..
};
var sql = new System.Text.StringBuilder("exec YourStoreProc");
sql.Append(string.Join(separator: ",", values: parameters.Select(p => $" @{ p.ParameterName }")));
var ctx = scope.ServiceProvider.GetRequiredService();
return await ctx
.Query()
.AsNoTracking()
.FromSql(sql.ToString(), parameters.ToArray
Over some iterations, I built up the following to help me compose the SQL:
public static string GetStoredProcSql(string name, SqlParameter[] parameters)
{
var stringOfParameters =
string.Join(
separator: ",",
values: parameters.Select(GetStringOfParameterNameValuePairs)
);
return $"exec [{name}] {stringOfParameters};";
}
public static string GetStringOfParameterNameValuePairs(SqlParameter parameter)
{
var name = parameter.ParameterName;
var value =
ShouldSqlDbTypeValueRequireQuotes(parameter)
? $"\'{parameter.Value}\'"
: parameter.Value;
return $" @{name}={value}";
}
public static bool ShouldSqlDbTypeValueRequireQuotes(SqlParameter parameter)
{
return new Enum[] {
// SqlDbTypes that require their values be wrapped in single quotes:
SqlDbType.VarChar,
SqlDbType.NVarChar
}.Contains(parameter.SqlDbType);
}
And to use:
public async Task> GetJobList(
CancellationToken cancellationToken,
int pageStart = 1,
int pageSize = 10
)
{
using (var scope = _services.CreateScope())
{
var logger = scope.ServiceProvider.GetRequiredService>();
logger.LogInformation($"Getting list of share creation jobs..");
var ctxJob = scope.ServiceProvider.GetRequiredService();
var sql = SqlDataHelper.GetStoredProcSql( // use here!
"GetJobList",
new[]
{
new SqlParameter("pageStart", System.Data.SqlDbType.Int) { Value = pageStart },
new SqlParameter("pageSize", System.Data.SqlDbType.Int) { Value = pageSize },
//new SqlParameter("filterFieldValuePairs", System.Data.SqlDbType.VarChar) { Value = filter },
new SqlParameter("itemType", System.Data.SqlDbType.VarChar, 10) { Value = "Share" },
});
return await ctxJob
.Query()
.AsNoTracking()
.FromSql(sql)
.ToListAsync(cancellationToken);
}
}