在方法的输入端,我有一个模型,它由{ "Id": [ "string" ], "Status": "string", "systemStatus": "string"}我在ssms中检查了请求,它工作了,但是在调试这个方法时,我看到了不同的结果.dapper取第一个id并返回1个用户,但是在sql studio中,返回6个人
public async Task<IEnumerable<User>> FindUser(Users model)
{
DynamicParameters parameters = new DynamicParameters();
parameters.Add("@Id", model.Id);
parameters.Add("@Status", model.Status);
parameters.Add("@systemStatus", model.SystemStatus);
IEnumerable<User> items = null;
var sql = @"SELECT statusesid FROM userstatuses WHERE [id] IN (@Id)
AND [status] in (@Status) and [systemStatus] in (@systemStatus)";
try
{
using (var db = new SqlConnection(connectionString))
{
if (db.State != ConnectionState.Open)
await db.OpenAsync();
items = await db.QueryAsync<User>(sql, parameters);
}
}
catch (Exception e)
{
_logger.Error(e);
}
return items;
}
我试着用string.Join(",",model.Id),但结果是一样的。
Dapper以不同的方式解释sql的 "in"。有一个看下面的转换为in sql操作符,并尝试适应你的变化相应。
Sql查询:
SELECT * FROM TableA WHERE id IN (commaSeparatedlistOfIDs)
Dapper转换上述查询。
string sql = "SELECT * FROM TableA WHERE id IN @ids"
var results = conn.Query(sql, new { ids = new[] { 1, 2, 3, 4, 5 }});
如果你有sql中的列表,你只需要写 "SELECT * FROM TableA WHERE id IN"。@ids"没有括号,dapper会把它们独立地放下来。