18

いくつかのパラメーターを受け取るEntityFrameworkでRAWSQLステートメントを実行しようとしています。私が使用しているメソッドはDbSet.SqlQueryからのものです

paramsオブジェクト配列の作成方法について混乱しています:params object [] parameters

これが私のコードブロックです:

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を作成してオブジェクト配列に入れてみましたが、うまくいきませんでした。誰かがparamsobject[]パラメータを構築する方法の例を提供できますか

ありがとう!ノミ

4

2 に答える 2

18

メソッドのパラメーターをクリーンアップして、データベースの列と同じにならないようにしました。これはあまり明確ではありませんでした。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つの列を返すだけなので、エンティティにマップしようとしていたため、サブ選択で*を選択する必要がありました。この解決策は私のために働くことが証明されました!

最終的に、object[]パラメータ全体は次のように実行できます。

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

hwcverweにご協力いただきありがとうございます。

ノミ

于 2012-05-11T17:00:52.083 に答える
7

上記の答えは正しいですが、の署名SqlQueryは であるためSqlQuery(sql:String, params object[] parameters)、次を使用してコードを簡略化し、より自然な感触を与えることができます。

context.SqlQuery(sql, latParam, lngPara);

これは、最初に配列する必要がなくても完全に合法です。

SQLクエリでパラメータ値を参照するには、値@p0@p1for値latParamlngParaそれぞれ使用します。

于 2015-11-18T23:02:38.250 に答える