私は、値のリストをフィルタリングするための文字列配列(query.Tags)を持っていますが、たびにproccesはクエリ実行中に文字列配列の最初の値をとるだけです。 私はいくつかの組み合わせを試みましたが、何も変わりませんでした。もちろん、これらのSQL文はすべてSQL Server Viewでテストされました。C#文字列配列を使用したIN文の大まかな問題
私が間違っていることを教えてもらえますか?
public IEnumerable<ActorDto> SearchMembersInLists(ListMembersQuery query)
{
IEnumerable<ActorDto> result = null;
var sql = @"select DISTINCT t.ActorId,
a.Id, a.TypeId, a.Name, a.Identifier
FROM [ActorTag] t
INNER JOIN [Actor] a ON t.ActorId = a.Id
where t.Name IN @tags
";
using (var cnx = DbConnectionFactory.GetDefault().GetConnection())
{
cnx.Open();
var query_result = cnx.QueryMultiple(sql, new { query.Tags});
result = query_result.Read<ActorDto>();
}
return result;
}
示すコードで間違って何もあなたがDapperの最新バージョンを使用していると仮定すると、ありません
public IEnumerable<ActorDto> SearchMembersInLists(ListMembersQuery query)
{
IEnumerable<ActorDto> result = null;
var sql = @"
SELECT DISTINCT a.Id, a.TypeId, a.Name, a.Identifier,a.Description, a.Email, a.PictureUrl, a.DisplayName --Actor
FROM [RoleMember] lm
INNER JOIN [Actor] a ON lm.ActorId = a.Id
WHERE {tag_filter} {lists_filter}
ORDER BY a.DisplayName DESC OFFSET @pageIndex ROWS FETCH NEXT @pageSize ROWS ONLY
";
bool has_tags = true;
bool has_lists = true;
if (query.Tags != null && query.Tags.Any())
{
sql = sql.Replace("{tag_filter}", "a.Id IN (SELECT t.ActorId FROM [ActorTag] t WHERE t.Name IN @tags)");
has_tags = true;
}
else
{
sql = sql.Replace("{tag_filter}", "");
has_tags = false;
}
if (query.Lists != null && query.Lists.Any())
{
if (has_tags)
{
sql = sql.Replace("{lists_filter}", "AND lm.RoleId IN @lists");
}
else
{
sql = sql.Replace("{lists_filter}", "lm.RoleId IN @lists");
}
has_lists = true;
}
else
{
sql = sql.Replace("{lists_filter}", "");
has_lists = false;
}
if (!has_tags && !has_lists){
sql = sql.Replace("WHERE", "");
}
var values = new
{
lists = query.Lists,
tags = query.Tags,
pageIndex = query.PageIndex * query.PageSizeOrDefault,
pageSize = query.PageSizeOrDefault
};
using (var cnx = DbConnectionFactory.GetDefault().GetConnection())
{
cnx.Open();
result = cnx.Query<ActorDto>(sql, values);
}
return result;
}
それはListMembersQuery'と '' ActorDto'の定義を投稿するに役立つかもしれません。 – Jedidja
こんにちは。 'query.Tags'が何であるかを見せて、それが実際に複数の値を持っていることを理想的に確認できますか?実際には 'QueryMultiple'の必要はありません - ' return cnx.Query(sql、new {query.Tags}); 'はうまくいくはずです - これは問題に関連している可能性がありますか?それを試してみることができますか?また、どのdapperのバージョン(番号)を使用していますか? –
こんにちは、Dapperの最新バージョンを使用しています。私は既に単純なクエリを試しています – Seriocha