c# - query - executesqlcommand entity framework core
Cómo pasar parámetros a DbSet.SqlQuery Method en Entity Framework (2)
Estoy tratando de ejecutar una sentencia RAW SQL en Entity Framework que toma algunos parámetros. El método que estoy usando es de DbSet.SqlQuery
Estoy confundido sobre cómo construir la matriz de objetos params: params objeto [] parámetros
Este es mi bloque de código aquí:
public ActionResult APILocation(string lat, string lng)
{
string SQL = "select * from (select Distance = ((ACOS(SIN(@lat * PI() / 180) * SIN(lat * PI() / 180) + COS(@lat * PI() / 180) * COS(lat * PI() / 180) * COS((@lng - Long) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) from dbo.Stores) t where Distance < 10 order by Distance asc";
ObjectParameter latParam = new ObjectParameter("lat", lat);
ObjectParameter lngParam = new ObjectParameter("lng", lng);
object[] parameters = new object[] { latParam, lngParam };
var stores = db.Stores.SqlQuery(SQL, parameters);
return Json(stores, JsonRequestBehavior.AllowGet);
}
Intenté crear ObjectParameter y colocarlo en una matriz de objetos, pero no funcionó. ¿Puede alguien proporcionar un ejemplo sobre cómo debo construir los parámetros params objeto []?
¡Gracias! Pulga
Las respuestas anteriores son correctas, pero como la firma de SqlQuery es SqlQuery (sql: String, params object [] parameters), puede simplificar el código y darle una sensación más natural utilizando:
context.SqlQuery(sql, latParam, lngPara);
Esto sería perfectamente legal sin tener que organizarlo primero.
Terminé limpiando los parámetros de mi método para que no fueran lo mismo que las columnas de mi base de datos, lo que no era muy claro. El ObjectParameter no admite el símbolo @, por lo que no funcionó. Terminé con la siguiente solución:
public ActionResult APILocation(string latitude, string longitude)
{
string SQL = "select * from (select *, Distance = ((ACOS(SIN({0} * PI() / 180) * SIN(lat * PI() / 180) + COS({0} * PI() / 180) * COS(lat * PI() / 180) * COS(({1} - long) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) from dbo.Parish) t where Distance < 10 order by Distance asc";
SqlParameter latParam = new SqlParameter("lat", latitude);
SqlParameter lngParam = new SqlParameter("long", longitude);
object[] parameters = new object[] { latParam , lngParam };
var stores = db.Store.SqlQuery(SQL, parameters);
return Json(stores, JsonRequestBehavior.AllowGet);
}
También tuve que seleccionar * en mi subselección porque estaba tratando de asignar a mi entidad lo que no podía, ya que solo estaba devolviendo una columna y no todo. ¡Esta solución probó funcionar para mí!
En última instancia, todos los parámetros del objeto [] se pueden hacer así:
SqlParameter latParam = new SqlParameter("latitude", latitude);
SqlParameter lngParam = new SqlParameter("longitude", longitude);
object[] parameters = new object[] { latitude, longitude };
Gracias hwcverwe por tu ayuda.
Pulga