Вопрос по entity-framework, asp.net-mvc, c# – Как передать параметры в метод DbSet.SqlQuery в Entity Framework

17

Я пытаюсь выполнить инструкцию RAW SQL в Entity Framework, которая принимает некоторые параметры. Метод, который я использую, взят изDbSet.SqlQuery

Я запутался, как построить массив объектов params: params object [] параметры

Это мой блок кода здесь:

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

Я попытался создать ObjectParameter и поместить его в массив объектов, но это не сработало. Может кто-нибудь привести пример того, как я должен построить параметры params object []

Спасибо! блоха

Ваш Ответ

2   ответа
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);

}

Я также должен был выбрать * в моем суб-выборе, потому что он пытался отобразить на мою сущность, что не смог, так как я только возвращал один столбец, а не все. Это решение помогло мне!

В конечном счете, параметры всего объекта [] можно сделать так:

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

Спасибо за помощь.

Блошиный

Твой пост не имеет смысла. Вы даете своим параметрам имена «широта» и «долгота», но в реальном запросе вы используете «широту» и «долготу». Кроме того, вы называете SqlParameters "latParam" и "lngParam", но впоследствии не используете их. Kugel
Для тех, кто интересуется, как правильно определять и использовать параметры: в SQL"Select @YourParamName", в кодеnew SqlParameter("YourParamName", 12345); Monsignor
7

но поскольку подпись для SqlQuery - SqlQuery (параметры sql: String, params object []), вы можете упростить код и придать ему более естественный вид, используя:

context.SqlQuery(sql, latParam, lngPara);

Это было бы совершенно законно, без необходимости сначала разбирать его.

Похожие вопросы