如何将参数传递给Entity Framework中的DbSet.SqlQuery方法

Fle*_*lea 17 c# asp.net-mvc 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);
        } 
Run Code Online (Sandbox Code Playgroud)

我尝试创建ObjectParameter并将其放入一个对象数组但是没有用.有人可以举例说明我应该如何构造params object []参数

谢谢!跳蚤

Fle*_*lea 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);

}
Run Code Online (Sandbox Code Playgroud)

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

最终,整个object []参数可以像这样完成:

 SqlParameter latParam = new SqlParameter("latitude", latitude);
 SqlParameter lngParam = new SqlParameter("longitude", longitude);
 object[] parameters = new object[] { latitude, longitude };
Run Code Online (Sandbox Code Playgroud)

感谢hwcverwe的帮助.

跳蚤

  • 你的帖子毫无意义.您为参数命名"latitude"和"longitude",但在实际查询中使用"lat"和"Long".此外,您将SqlParameters命名为"latParam"和"lngParam",但之后不再使用它们. (27认同)
  • 对于那些想知道如何正确定义和使用参数的人:在 SQL `"Select @YourParamName"` 中,在代码 `new SqlParameter("YourParamName", 12345);` (2认同)

use*_*708 7

上面的答案是正确的,但由于SqlQuery的签名是SqlQuery(sql:String,params object []参数),您可以通过使用以下内容简化代码并使其更自然!

context.SqlQuery(sql, latParam, lngPara);
Run Code Online (Sandbox Code Playgroud)

这是完全合法的,无需先排序.