如何将参数传递给实体框架中的 DbSet.SqlQuery 方法
本文关键字:DbSet SqlQuery 方法 框架 实体 参数传递 | 更新日期: 2023-09-27 18:33:49
我正在尝试在实体框架中执行一个接受一些参数的 RAW SQL 语句。我正在使用的方法来自 DbSet.SqlQuery
我对如何构造参数对象数组感到困惑:参数对象[]参数
这是我的代码块:
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 并将其放入对象数组中,但这不起作用。 有人可以提供一个例子来说明我应该如何构造参数对象[] 参数
谢谢!跳蚤
我最终清理了方法的参数,这样它们就不会与我的数据库列相同,这不是很清楚。对象参数不支持 @ 符号,因此不起作用。我最终得到了以下解决方案:
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);
}
我还必须在我的子选择中选择 *,因为它试图映射到我的实体,但它无法映射,因为我只返回一列而不是所有内容。事实证明,此解决方案对我有用!
最终,整个 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[] parameters)
,您可以使用以下命令简化代码并赋予其更自然的感觉:
context.SqlQuery(sql, latParam, lngPara);
这将是完全合法的,而不必先排列它。
若要引用 sql 查询中的参数值,请分别对值latParam
和lngPara
使用 @p0
和 @p1
。