2016-06-23 22 views
6

DB MySQLとしてN-N関係をdapperとマップしようとしています。これは多かれ少なかれのコードです。ダッパーマルチマッピングの多対多関係

 var query = new StringBuilder(); 
     query.Append("SELECT O.Id, O.Email, O.Status, P.Name FROM Owners AS O"); 
     query.Append(" INNER JOIN OwnerPets OP ON OP.OwnerId = O.Id"); 
     query.Append(" INNER JOIN Pets AS P ON P.Id = OP.PetId"); 
     query.Append(" WHERE O.Status = @Status;"); 

     using (var dbConnection = CreateConnection()) 
     { 
      return dbConnection.Query<Owner, IEnumerable<Pet>, Owner>(query.ToString(), (owner, pets) => 
      { 
       owner.Pets = pets.ToList(); 
       return Owner; 
      }, new { Status = status }, splitOn: "OwnerId, PetId"); 
     } 

クエリがSQLクライアントで正常に動作しますが、私は上記のコードを実行したときに、私はこの例外を取得:「マルチマッピングAPIを使用するときは、ID以外のキーを持っている場合は、splitOnのPARAMを設定することを確認しパラメータ。名前:splitOn "

中間テーブル(OwnerPets)を持つNN関係をマップすることは可能ですか?...もしそうなら...私は間違っていますか?

答えて

5

Dapperに必要なデータを直接返すことができるかどうかはわかりませんが、所有者とペットの間に1対1の関係があるようにデータを読み込んでLINQクエリ各オーナーのペットをグループ化します。

return dbConnection 
    .Query<Owner, Pet, Owner>(
     query, 
     (owner, pet) => 
     { 
      owner.Pets = owner.Pets ?? new List<Pet>(); 
      owner.Pets.Add(pet); 
      return owner; 
     }, 
     new { Status = status }, 
     splitOn: "Name" 
    ) 
    .GroupBy(o => o.Id) 
    .Select(group => 
    { 
     var combinedOwner = group.First(); 
     combinedOwner.Pets = group.Select(owner => owner.Pets.Single()).ToList(); 
     return combinedOwner; 
    });