C# API返回必须声明标量变量错误
我正在使用实体框架核心,并尝试执行包含两个过滤器参数的查询,然后返回响应。我正在从Angular应用程序调用API 以上两个字段都可以作为查询传递给EF核心,或者用户可能只选择一个字段,然后相应地更改过滤器 我正在做的事情如下所示C# API返回必须声明标量变量错误,c#,entity-framework,asp.net-core,asp.net-web-api,C#,Entity Framework,Asp.net Core,Asp.net Web Api,我正在使用实体框架核心,并尝试执行包含两个过滤器参数的查询,然后返回响应。我正在从Angular应用程序调用API 以上两个字段都可以作为查询传递给EF核心,或者用户可能只选择一个字段,然后相应地更改过滤器 我正在做的事情如下所示 public List<ShipmentDetailByShipDate> GetByQueryFilter(string queryPara) { var queryParameter = new SqlParamete
public List<ShipmentDetailByShipDate> GetByQueryFilter(string queryPara)
{
var queryParameter = new SqlParameter("queryPara", queryPara);
return _context.ShipmentDetailsByShipDate.FromSql<ShipmentDetailByShipDate>(SQueryPara, queryParameter).ToList();
}
我的控制器方法如下
public IActionResult GetByQueryFilter()
{
string queryPara = "r_proj = '000634' and sdate = '2019-07-01'";
return Ok(_shipmentRepository.GetByQueryFilter(queryPara));
}
出于测试目的,我正在控制器中对queryPara
进行硬编码。但是当我调用我的API时,我得到的错误如下
System.Data.SqlClient.SqlException:'必须声明标量变量“@queryParameter”。
我如何处理这种情况,是否可以以不同的方式处理
"@queryPara" != "@queryParameter";
将“queryPara”
作为参数中的名称传递
var queryParameter = new SqlParameter("queryPara", queryPara);
但是在语句中使用@queryParameter
"...where @queryParameter group by..."
指定给SqlParameter
的名称需要与使用的is语句匹配
var queryParameter = new SqlParameter("queryParameter", queryPara);
但是考虑到你通过的是
string queryPara = "r_proj = '000634' and sdate = '2019-07-01'"
在查询中,这将为您提供以下信息
在需要条件的上下文中指定的非布尔类型的表达式
因为语句的构造不正确
考虑重构所使用的方法
构造适当的参数化语句以避免SQL注入攻击
public List<ShipmentDetailByShipDate> GetByQueryFilter(string query, SqlParameter[] parameters = null) {
if (parameters != null && parameters.Length > 0) {
return _context.ShipmentDetailsByShipDate.FromSql<ShipmentDetailByShipDate>(query, parameters).ToList();
}
return return _context.ShipmentDetailsByShipDate.FromSql<ShipmentDetailByShipDate>(query).ToList();
}
@queryPara
!=<代码>@queryParameter正常。这似乎是一个.I get now:“在预期条件的上下文中指定的非布尔类型的表达式,靠近“group”。
@trx您不能将表达式作为参数传递。使用参数的原因之一就是为了防止出现这种情况。此时,您的结果SQL有效地选择prj_编号、位置,其中“r_proj=''000634''和sdate=''2019-07-01''按prj_编号、位置分组,这没有任何意义。您应该将r_proj
和sdate
作为单独的参数传递,并在查询中将它们作为引用,其中r_proj=@rproj和sdate=@sdate
@John yep意识到,一旦答案被接受并做出评论,但由于接受而无法删除,因此我可以编辑。
public List<ShipmentDetailByShipDate> GetByQueryFilter(string query, SqlParameter[] parameters = null) {
if (parameters != null && parameters.Length > 0) {
return _context.ShipmentDetailsByShipDate.FromSql<ShipmentDetailByShipDate>(query, parameters).ToList();
}
return return _context.ShipmentDetailsByShipDate.FromSql<ShipmentDetailByShipDate>(query).ToList();
}
public IActionResult GetByQueryFilter() {
string query = @"Select prj_number,location from sTable where r_proj = @r_proj and sdate = @sdate group by prj_number,location";
var parameters = new [] {
new SqlParameter("r_proj", "000634"),
new SqlParameter("sdate", "2019-07-01"),
}
return Ok(_shipmentRepository.GetByQueryFilter(query, parameters));
}