使用 mySQL 将 int 列表传递给 dapper

Jos*_*dge 2 c# mysql database mysql-workbench dapper

我有一个当前的工作解决方案,正在为列表中的每个项目 Id 执行新的数据库调用,并且我正在尝试执行单个调用,而不是从多个项目返回数据。

为此,我尝试将项目 ID 列表传递到访问 MySQL 数据库的 Dapper 查询中。我要么收到操作数应包含 1 列的错误,要么收到第一个结果,而不是数据库中每个 projectId 的结果。我当前使用的 c# 代码是

public List<ProjectPortalManager> GetPPTech(IEnumerable<int> projIds)
{
 string sql = @"SELECT tProject.ProjectID, 
                       tProject.ProjectName, 
                       tProject.PMUserID, 
                       if(cast(tproject.dateinit as char) = '0000-00-00 00:00:00',null,tproject.dateinit) as DateInit,
                       tproject.comments, 
                       tproject.ProjectNumber,
                       c.LName, 
                       c.FName, 
                       c.orgid, 
                       c.orgname as organization, 
                       c.Email, 
                       c.Phone 
                From tProject left Join tContacts c on tProject.PMUserID = c.UserId
                Where tProject.ProjectID in (@ProjIds);";
            try
            {
                List<ProjectManager> pms = Conn.Query<ProjectManager>(sql, new { ProjIds = new[] { projIds } }).ToList();
                return pms;
            }
            catch (Exception ex)
            {
                ErrorReport.ReportError(ex);
            }
 return new List<ProjectPortalManager>();
}
Run Code Online (Sandbox Code Playgroud)

这不会出错,但会返回 0 个结果。在 MySQL Workbench 中运行查询时,我确实得到了一个结果。然而我期待几个结果。我在工作台中运行的 SQL 是:

SET @projIds = ('28, 99, 9');
SELECT tProject.ProjectID, 
       tProject.ProjectName, 
       tProject.PMUserID, 
       if(cast(tproject.dateinit as char) = '0000-00-00 00:00:00',null,tproject.dateinit) as DateInit,
       tproject.comments, tproject.ProjectNumber,
       c.LName, 
       c.FName, 
       c.orgid, 
       c.orgname as organization, 
       c.Email, 
       c.Phone 
From tProject left Join tContacts c on tProject.PMUserID = c.UserId
where tProject.ProjectID IN (@projIds);
Run Code Online (Sandbox Code Playgroud)

我已经验证所有使用的 ID 号确实存在于数据库中。关于如何执行此操作,网上似乎有相互矛盾的信息,但我还没有找到似乎有效的解决方案。

Cai*_*ard 6

如果您希望 Dapper 将 IN 展开为参数列表并填充它们,请不要在 IN 两边加上括号

where tProject.ProjectID IN @PIDs
Run Code Online (Sandbox Code Playgroud)

假设您在 - Dapper 中传递了一个大小为 3 的数组,new { PIDs = projIds.ToArray() }它会有效地将您的 SQL 转换为:

where tProject.ProjectID IN (@PIDs1, @PIDs2, @PIDs3)
Run Code Online (Sandbox Code Playgroud)

然后表现得好像你已经通过了new { PIDs1 = projIds[0], PIDs2 = projIds[1], PIDs3 = projIds[2] }