我正在尝试做的是有一个像这样填充的过滤器对象
var filter = new Filter
{
ThingID = 1,
Keywords = new[] { "op", "s" }
};
然后能够像这样建立查询:
var sb = new StringBuilder();
sb.AppendLine("select * from Stuff where 1=1");
if (filter.ThingID.HasValue)
{
sb.AppendLine(" and ThingID = @ThingID");
}
if (filter.Keywords != null)
{
for (int i = 0; i < filter.Keywords.Length; i++)
{
string keyword = filter.Keywords[i];
if (!string.IsNullOrWhiteSpace(keyword))
{
sb.AppendLine(" and ( Model like '%' || @Keywords" + i + " || '%' )");
}
}
}
var sql = sb.ToString();
var results = Query<Stuff>(sql, filter).ToList();
如果仅填充ThingID道具,这可以正常工作,但据我所知,Dapper不会以任何方式将关键字作为参数提供。这可能与Dapper有关,还是只能在“@Keywords中的关键字”的上下文中工作?
参数需要按名称匹配;你正在添加像@Keywords17
这样的参数,但没有Keywords17
属性可以添加。它没有将其解释为Keywords[17]
,如果这就是你的意思。 有一些扁平阵列的自动扩展,但这是用于扩大in @Keywords
(虽然扩张本身不是特定于in
)。目前没有任何东西可以自动帮助你;我会建议使用DynamicPaameters
:
var args = new DynamicParameters();
args.Add("ThingID", 1);
...
if (!string.IsNullOrWhiteSpace(keyword))
{
sb.AppendLine(" and ( Model like '%' || @Keywords" + i + " || '%' )");
args.Add("Keywords" + i, keyword);
}
...
var cmd = new CommandDefinition(sql, args, flags: CommandFlags.NoCache);
var results = Query<Stuff>(cmd).AsList();
请注意这里最后的两个更改 - CommandFlags.NoCache
将帮助避免为类似但不同的SQL构建大量查找条目(尽管您可能选择支付此项以减少每个项目的成本,由您决定)。 AsList
而不是ToList
避免了额外的列表分配。