2016-06-27 6 views
2

私は、値のリストをフィルタリングするための文字列配列(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;   
     } 
+0

それはListMembersQuery'と '' ActorDto'の定義を投稿するに役立つかもしれません。 – Jedidja

+0

こんにちは。 'query.Tags'が何であるかを見せて、それが実際に複数の値を持っていることを理想的に確認できますか?実際には 'QueryMultiple'の必要はありません - ' return cnx.Query (sql、new {query.Tags}); 'はうまくいくはずです - これは問題に関連している可能性がありますか?それを試してみることができますか?また、どのdapperのバージョン(番号)を使用していますか? –

+0

こんにちは、Dapperの最新バージョンを使用しています。私は既に単純なクエリを試しています – Seriocha

答えて

1

私ができるように、元のコードはこれです、私は単純化してみました。同様の例を以下に示します(これはコンソールEXEなどで実行できます)。あなたのデータが期待どおりであることを確認してください。

注:クエリコードは実際にはと大幅にに簡略化できますが、私は可能な限りあなたの例に似ていると思っています。簡単な代替方法は次のとおりです。

public static IEnumerable<ActorDto> SearchMembersInLists(ListMembersQuery query) 
{ 
    using (var cnx = GetConnection()) 
    { 
     return cnx.Query<ActorDto>(
      @"select Id, Name from FooActors where Name IN @Tags", new { query.Tags }); 
    } 
} 

より複雑なクエリレイアウトのプログラム全体を以下に示します。出力は次のとおりです。

2: Barney 
4: Betty 

using Dapper; 
using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 

class Program 
{ 
    static void Main() 
    { 
     // reset and populate 
     using (var conn = GetConnection()) 
     {    
      conn.Open(); 
      try { conn.Execute(@"drop table FooActors;"); } catch { } 
      conn.Execute(@"create table FooActors (
       Id int not null primary key identity(1,1), 
       Name nvarchar(50) not null);"); 
      conn.Execute(@"insert FooActors(Name) values(@Name);", new[] 
      { 
       new { Name = "Fred" }, 
       new { Name = "Barney" }, 
       new { Name = "Wilma" }, 
       new { Name = "Betty" }, 
      }); 
     } 

     // run a demo query 
     var tags = new[] { "Barney", "Betty" }; 
     var query = new ListMembersQuery { Tags = tags }; 
     var actors = SearchMembersInLists(query); 
     foreach(var actor in actors) 
     { 
      Console.WriteLine("{0}: {1}", actor.Id, actor.Name); 
     } 
    } 
    public static IDbConnection GetConnection() 
    { 
     return new SqlConnection(
      @"Initial Catalog=master;Data Source=.;Integrated Security=SSPI;"); 
    } 
    public class ActorDto 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
    public class ListMembersQuery 
    { 
     public string[] Tags { get; set; } 
    } 
    public static IEnumerable<ActorDto> SearchMembersInLists(ListMembersQuery query) 
    { 
     IEnumerable<ActorDto> result = null; 
     const string sql = @"select Id, Name from FooActors where Name IN @Tags"; 
     using (var cnx = GetConnection()) 
     { 
      cnx.Open(); 
      var query_result = cnx.QueryMultiple(sql, new { query.Tags }); 
      result = query_result.Read<ActorDto>(); 
     } 

     return result; 
    } 
} 
+0

(IN INタグ)感受性) –