2012-05-11 2 views
16

にDbSet.SqlQueryメソッドにパラメータを渡します。私が使っている方法は、私がのparamsオブジェクトの配列を作成する方法について混乱していますDbSet.SqlQueryは、どのように私はいくつかのパラメータを取りますエンティティフレームワークでRAW SQL文を実行しようとしていますEntity Frameworkの

からです:paramsはこれがここに私のコードブロックである[]パラメータ

オブジェクト:

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

私が作成してみましたObjectParameterとそれをオブジェクト配列に入れても動作しませんでした。誰かが私が

おかげのparamsオブジェクト[]パラメータを構築する方法についての例を提供することができます! ノミ

答えて

16

は、私は、彼らは非常に明確ではありませんでした私のデータベース列と同じでないように私のメソッドのパラメータをクリーンアップすることになりました。 ObjectParameterは@記号をサポートしていないため、動作しませんでした。

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

} 

私もそれは私がちょうど1列ではなく、すべてを返していましたができませんでしたので、私のエンティティにマッピングしようとしていたので、私のサブ選択で*を選択する必要がありました:私は、次の解決策になってしまいました。このソリューションは私のために働くことが判明しました!

最終的には、全体のオブジェクト[]パラメータは次のように行うことができます。あなたの助けを

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

おかげhwcverweを。

ノミ

+26

あなたの投稿には意味がありません。あなたのパラメータ名「緯度」及び「経度」を与えるが、実際のクエリでは、あなたは「緯度」と「ロング」を使用します。また、あなたは「latParam」と「lngParam」SqlParametersに名前を付けていますが、その後、それらを使用しないでください。 – Kugel

+1

パラメータを正しく定義して使用する方法を知りたい方へ: SQLの '' Select @YourParamName ''、コード' new SqlParameter( "YourParamName"、12345); ' – Monsignor

7

は、上記の答えが正しいしかしのSQLQueryの署名が のSQLQuery(SQL:文字列、paramsは[]パラメータを物体)であるので、コードを簡素化し、使用してそれをより自然な感触を与えることができます。

context.SqlQuery(sql, latParam, lngPara); 

これは、最初に配列することなく完全に合法的になります。

関連する問題