如何将参数传递给Entity Framework中的DbSet.SqlQuery方法
我试图在Entity Framework中执行一个RAW SQL语句,它接受一些参数。 我使用的方法来自DbSet.SqlQuery
我对如何构造params对象数组感到困惑:params object []参数
这是我的代码块:
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 []参数
谢谢! 跳蚤
我最终清理了我的方法的参数,所以它们与我的数据库列不一样,不太清楚。 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); }
我还必须在我的子选择中选择*,因为它试图映射到我的实体,它不能,因为我只是返回一列而不是一切。 事实certificate这个解决方案对我有用!
最终,整个object []参数可以像这样完成:
SqlParameter latParam = new SqlParameter("latitude", latitude); SqlParameter lngParam = new SqlParameter("longitude", longitude); object[] parameters = new object[] { latitude, longitude };
感谢hwcverwe的帮助。
跳蚤
上面的答案是正确的,但由于SqlQuery的签名是SqlQuery(sql:String,params object []参数),您可以使用以下方法简化代码并使其更自然!
context.SqlQuery(sql, latParam, lngPara);
这是完全合法的,无需先排序。