【发布时间】:2022-01-25 01:33:21
【问题描述】:
我有一个当前有效的解决方案,它正在为列表中的每个项目 ID 执行新的数据库调用,我正在尝试执行单个调用,而不是从多个项目返回数据。
为此,我尝试将项目 ID 的列表传递到访问 MySQL 数据库的 Dapper Query 中。我要么得到一个操作数应该包含 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>();
}
这不会出错,但会返回 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);
我已验证所有使用的身份证号码确实存在于数据库中。 网上似乎有关于如何做到这一点的相互矛盾的信息,但我还没有找到似乎可行的解决方案。
【问题讨论】:
-
请注意,通过在方法签名中说
IEnumerable<int> projIds,然后在匿名类型dec 中说ProjIds = new[]{projIds},您实际上是在创建一个IEnumerables 数组;我不是 100% 相信 Dapper 会理解如何在预期int[]时解开“类似于”int[][]的内容。我调整了我的答案示例以使用ToArray()int[]使用IEnumerable<int>- 也许它适用于 IE 直通;我只发送过一个数组,目前无法测试。尝试发送Query("SELECT.. IN @projIds", new { projIds }) 但不发送new{new[]{projIds}} -
这个答案对我有用。非常感谢@CaiusJard
-
它一定像删除括号一样简单。它似乎也可以与 IEnumerable 一起使用,而无需转换为数组
标签: c# mysql database mysql-workbench dapper