Как передать параметры методу DbSet.SqlQuery в платформе Entity Framework
Я пытаюсь выполнить оператор RAW SQL в Entity Framework, который принимает некоторые параметры. Метод, который я использую, - 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 и поместить его в массив объектов, но это не сработало. Может ли кто-нибудь представить пример того, как я должен создавать параметры params object []
Спасибо!
Блошиный
Ответы
Ответ 1
Я закончил тем, что очистил параметры моего метода, чтобы они не совпадали с моими столбцами базы данных, которые были не очень ясны. 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);
}
Мне также пришлось выбирать * в моем суб-select, потому что он пытался сопоставить мою сущность, которой это не могло, поскольку я просто возвращал один столбец, а не все. Это решение оказалось для меня полезным!
В конечном счете, все параметры объекта [] можно сделать следующим образом:
SqlParameter latParam = new SqlParameter("latitude", latitude);
SqlParameter lngParam = new SqlParameter("longitude", longitude);
object[] parameters = new object[] { latitude, longitude };
Спасибо за вашу помощь.
Блошиный
Ответ 2
Вышеуказанные ответы верны, но поскольку подпись для SqlQuery является
Параметры SqlQuery (sql: String, params object []), вы можете упростить код и придать ему более естественный вид, используя:
context.SqlQuery(sql, latParam, lngPara);
Это было бы совершенно законно, без необходимости сначала его сортировать.