Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# API返回必须声明标量变量错误_C#_Entity Framework_Asp.net Core_Asp.net Web Api - Fatal编程技术网

C# API返回必须声明标量变量错误

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

我正在使用实体框架核心,并尝试执行包含两个过滤器参数的查询,然后返回响应。我正在从Angular应用程序调用API

以上两个字段都可以作为查询传递给EF核心,或者用户可能只选择一个字段,然后相应地更改过滤器

我正在做的事情如下所示

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