2012-05-11 28 views
16

Sto tentando di eseguire un'istruzione SQL RAW in Entity Framework che richiede alcuni parametri. Il metodo che sto usando è da DbSet.SqlQueryCome passare i parametri al metodo DbSet.SqlQuery in Entity Framework

sono confuso su come costruire la serie oggetto params: params object [] parametri

Questo è il mio blocco di codice qui:

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); 
     } 

Ho cercato di creare ObjectParameter e metterlo in un array di oggetti ma non ha funzionato. Qualcuno può fornire un esempio su come dovrei costruire i parametri params oggetto []

Grazie! Pulce

risposta

16

Ho finito per ripulire i parametri del mio metodo in modo che non fossero uguali alle colonne del mio database che non erano molto chiare. ObjectParameter non supporta il simbolo @, quindi non ha funzionato. Ho finito con la seguente soluzione:

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); 

} 

ho dovuto anche per selezionare * a mio sub-select perché stava cercando di mappare al mio ente che non poteva da quando ero solo tornando una colonna e non tutto . Questa soluzione ha funzionato per me!

In ultima analisi, i parametri [] intero oggetto può essere fatto in questo modo:

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

Grazie hwcverwe per il vostro aiuto.

pulci

+26

Il tuo post non ha senso. Dai il tuo nome ai parametri "latitudine" e "longitudine" ma nella query effettiva usi "lat" e "Long". Inoltre, si chiamano SqlParameters "latParam" e "lngParam", ma in seguito non li si utilizza. – Kugel

+1

Per quelli che si chiedono come definire e utilizzare correttamente i parametri: In SQL '" Seleziona @YourParamName "', nel codice 'new SqlParameter (" YourParamName ", 12345);' – Monsignor

7

Le risposte di cui sopra sono corrette, ma dal momento che la firma per SQLQuery è sqlquery (sql: String, params oggetto [parametri]), è possibile semplificare il codice e dare una sensazione più naturale utilizzando:

context.SqlQuery(sql, latParam, lngPara); 

Questo sarebbe perfettamente legale senza doverlo allineare prima.

Problemi correlati