如何在 Dapper 参数中使用列表?

问题描述 投票:0回答:1

最初为我的 Oracle SQL 后端编写了一堆查询,并且开始时没有使用参数化查询,而我只是在做一些设计和功能探索。现在我认为我已经得到了我想要的,我开始重构这些查询以进行参数化并防止注入。我的一些查询可能有点复杂,需要使用 where 子句并检查列表。

我遵循了位于此处的 Dapper 文档:https://www.learndapper.com/parameters#dapper-where-in-parameters

在不暴露我的整个查询的情况下,这是 where 子句:

WHERE 
    WR.WLOPST IN @OpStatus 
    AND WO.WASRST IN @WoStatus 
    AND TRIM(WL.MCRP01) IN @Plants 
    AND WC.IWMCUW IN @Depts 
    AND WR.WLMCU IN @WorkCenters 
    AND WR.WLDRQJ >= @DateStart AND WR.WLDRQJ <= @DateEnd

这是 SQL 调用:

var dispatchList = await cnx.QueryAsync<DispatchList>(query.query, 
                                                      new 
                                                      { 
                                                          OpStatus = query.OpStatus, 
                                                          WoStatus = query.WOStatus, 
                                                          Plants = query.plants, 
                                                          Depts = query.departments, 
                                                          WorkCenters = query.workcenters, 
                                                          DateStart = query.dateStart,
                                                          DateEnd = query.dateEnd 
                                                      });
dispatchListDTOs = _mapper.Map<IEnumerable<DispatchList>, List<DispatchListDTO>>(dispatchList);

查询对象是我编写的一个类,用于包含 SQL 和参数,如下所示:

public class DispatchListQuery : Query
{
    // Inherits public string query {get; set;}
    public string[] departments { get; set; }
    public string[] plants { get; set; }
    public string[] workcenters { get; set; }
    public string[] OpStatus { get; set; }
    public string[] WOStatus { get; set; }
    public int dateStart { get; set; }
    public int dateEnd { get; set; }
    .....
}

我收到错误

ORA-00936: 缺少表达式

我之前曾尝试使用 Dapper 参数列表,但从未能够让它们工作。

我可以将 SQL 复制到 Oracle SQL Developer 中,并将参数替换为实际列表,并且 SQL 运行良好。

我在这里缺少什么?

修复 Oracle 支持“:”作为参数,但不支持“@”。不确定 dapper 是否在我见过的他们的文档中提到了这一点,但如果他们这样做了那就太好了。

WHERE WR.WLOPST IN :OpStatus AND
    WO.WASRST IN :WoStatus AND
    TRIM(WL.MCRP01) IN :Plants AND WC.IWMCUW IN :Depts AND WR.WLMCU IN :WorkCenters
    AND WR.WLDRQJ >= :DateStart AND WR.WLDRQJ <= :DateEnd
ORDER BY WR.WLDOCO";
            parameters = new Dapper.DynamicParameters();
            parameters.Add(":OpStatus", OpStatus);
            parameters.Add(":WoStatus", WOStatus);
            parameters.Add(":Plants", plants);
            parameters.Add(":Depts", departments);
            parameters.Add(":WorkCenters", workcenters);
            parameters.Add(":DateStart", dateStart);
            parameters.Add(":DateEnd", dateEnd);
var distpatchList = await cnx.QueryAsync<DispatchList>(query.query, query.parameters);
c# sql asp.net oracle dapper
1个回答
0
投票

问题在于 Oracle 不支持“@”。 Oracle 仅支持“:”作为参数。为此,您必须创建一个 DynamicParameters() 对象并向其中添加参数。然后将对象传递给查询本身。

© www.soinside.com 2019 - 2024. All rights reserved.