2012-05-11 21 views
16

Estoy tratando de ejecutar una instrucción SQL RAW en Entity Framework que toma algunos parámetros. El método que estoy usando es de DbSet.SqlQueryCómo pasar parámetros al método DbSet.SqlQuery en Entity Framework

estoy confundido sobre cómo construir la tabla de objeto params: params Object [] parámetros

Ésta 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 ponerlo en una matriz de objetos pero eso no funcionó. ¿Alguien puede dar un ejemplo sobre cómo debería construir los parámetros del objeto params []

Gracias! Flea

Respuesta

16

Terminé limpiando los parámetros de mi método para que no fueran los mismos que las columnas de mi base de datos, que no era muy claro. ObjectParameter no admite el símbolo @, por lo que no funcionó. Que 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 sub-select, ya que se trata de un mapa a mi entidad que no podía ya que sólo estaba volviendo una columna y no todo . ¡Esta solución probó funcionar para mí!

En última instancia, los [] parámetros del objeto entero se puede hacer así:

SqlParameter latParam = new SqlParameter("latitude", latitude); 
SqlParameter lngParam = new SqlParameter("longitude", longitude); 
object[] parameters = new object[] { latitude, longitude }; 

Gracias hwcverwe por su ayuda.

pulgas

+26

Tu publicación no tiene sentido. Le das a tus parámetros los nombres "latitud" y "longitud", pero en la consulta real usas "lat" y "Long". Además, usted nombra los SqlParameters "latParam" y "lngParam", pero no los usa después. – Kugel

+1

Para aquellos que se preguntan cómo definir y usar parámetros correctamente: En el SQL '" Seleccione @YuPaParamName "', en el código 'new SqlParameter (" YourParamName ", 12345);' – Monsignor

7

Las respuestas anteriores son correctas, pero desde la firma de SQLQuery es SQLQuery (sql: String, params Object [] parámetros), se puede simplificar el código y darle una sensación más natural mediante el uso de:

context.SqlQuery(sql, latParam, lngPara); 

Esto sería perfectamente legal sin tener que ordenarlo primero.

Cuestiones relacionadas