18

我正在尝试在带有一些参数的实体框架中执行 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[] 参数的例子吗

谢谢!跳蚤

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);

}

我还必须在我的子选择中选择 * 因为它试图映射到我的实体,因为我只返回一列而不是所有内容。事实证明,这个解决方案对我有用!

最终,整个 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

上面的答案是正确的,但是由于SqlQueryis 的签名SqlQuery(sql:String, params object[] parameters),您可以简化代码并通过使用以下方式给它更自然的感觉:

context.SqlQuery(sql, latParam, lngPara);

这将是完全合法的,而不必先排列它。

要在 sql 查询中引用参数值,请分别使用@p0@p1作为值latParamlngPara

于 2015-11-18T23:02:38.250 回答