使用 mySQL 将 int 列表传递给 dapper
Passing a list of int to dapper with mySQL
我有一个当前有效的解决方案,它正在为列表中的每个项目 ID 执行新的数据库调用,我正在尝试执行单个调用而不是来自多个项目的 returns 数据。
为此,我尝试将项目 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>();
}
这不会出错,但会出现 returns 0 个结果。当 运行 在 MySQL Workbench 中查询时,我确实得到了一个结果。但是我期待几个结果。 SQL I 运行 in workbench 是:
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);
我已确认所有使用的身份证号码都存在于数据库中。
关于如何执行此操作的在线信息似乎相互矛盾,但我还没有找到似乎有效的解决方案。
如果您希望 Dapper 将其扩展为参数列表并填充它们,请不要在 IN 周围加上括号
where tProject.ProjectID IN @PIDs
假设您在 new { PIDs = projIds.ToArray() }
中传递了一个大小为 3 的数组 - Dapper 会有效地将您的 SQL 转换为:
where tProject.ProjectID IN (@PIDs1, @PIDs2, @PIDs3)
然后表现得好像你已经通过了 new { PIDs1 = projIds[0], PIDs2 = projIds[1], PIDs3 = projIds[2] }
我有一个当前有效的解决方案,它正在为列表中的每个项目 ID 执行新的数据库调用,我正在尝试执行单个调用而不是来自多个项目的 returns 数据。
为此,我尝试将项目 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>();
}
这不会出错,但会出现 returns 0 个结果。当 运行 在 MySQL Workbench 中查询时,我确实得到了一个结果。但是我期待几个结果。 SQL I 运行 in workbench 是:
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);
我已确认所有使用的身份证号码都存在于数据库中。 关于如何执行此操作的在线信息似乎相互矛盾,但我还没有找到似乎有效的解决方案。
如果您希望 Dapper 将其扩展为参数列表并填充它们,请不要在 IN 周围加上括号
where tProject.ProjectID IN @PIDs
假设您在 new { PIDs = projIds.ToArray() }
中传递了一个大小为 3 的数组 - Dapper 会有效地将您的 SQL 转换为:
where tProject.ProjectID IN (@PIDs1, @PIDs2, @PIDs3)
然后表现得好像你已经通过了 new { PIDs1 = projIds[0], PIDs2 = projIds[1], PIDs3 = projIds[2] }