2012-05-09 3 views
4

単一のクエリ(または複数の結果セットを持つストアドプロシージャ)を実行したい。私はDapperを使ってマルチマッピングを行う方法を知っていますが、2つのコレクションを同じ親にマップする方法をソートすることはできません。Dapperクエリをオブジェクトのコレクションにマッピングする(それ自体がいくつかのコレクションを持っている)

はあなたがここにMultiMappingを使用したいが、ない場合は
IQueryable<ParentObject> result = cnn.Query(
      // Some really awesome dapper syntax goes here 
); 

答えて

6

わからないです:基本的には、このオブジェクトの定義...私は何とか得Dapperのクエリを実行できるようにしたい

class ParentObject 
{ 
    string Name { get; set; } 
    ICollection<ChildObjectOne> ChildSetOne {get;set;} 
    ICollection<ChildObjectTwo> ChildSetTwo { get; set; } 
} 

class ChildObjectOne 
{ 
    string Name { get; set; } 
} 

class ChildObjectTwo 
{ 
    int id { get; set; } 
    string LocationName { get; set; } 
} 

を与えられましたそれがあなたの場合にどのように働くか。私が知っている限りでは、深いネストされたオブジェクトグラフを単純な0​​でマップすることはできません。ネストされたオブジェクトとDapperのため

static void Main(string[] args) 
     { 
      var sqlParent = "SELECT parentId as Id FROM ParentTable WHERE parentId=1;"; 
      var sqlChildOneSet = "SELECT Name FROM ChildOneTable;"; // Add an appropriate WHERE 
      var sqlChildTwoSet = "SELECT Id, LocationName FROM ChildTwoTable;"; // Add an appropriate WHERE 

      var conn = GetConnection() // whatever you're getting connections with 
      using (conn) 
      { 
       conn.Open(); 
       using (var multi = conn.QueryMultiple(sqlParent + sqlChildOneSet + sqlChildTwoSet)) 
       { 
        var parent = multi.Read<ParentObject>().First(); 
        parent.ChildSetOne = multi.Read<ChildOne>().ToList(); 
        parent.ChildSetTwo = multi.Read<ChildTwo>().ToList(); 
       } 
      } 
     } 

同様の質問:

https://stackoverflow.com/search?q=nested+objects+%2B+dapper

2

このケースでIEnumerable<TReturn> Query<TFirst, TSecond, TThird, TReturn>(this IDbConnection cnn, string sql, Func<TFirst, TSecond, TThird, TReturn> map);方法を使用して1対多の関係を持つオブジェクトを実体化することが可能です。しかし、そうするために十分な情報を得るためには、エンティティを少し変更する必要があります。

ここには、同様の質問をしているいくつかのSOスレッドがあります。

How do I map lists of nested objects with Dapper

Extension function to make it cleaner

Dapper.Net by example - Mapping Relationships

public class ParentObject 
{ 
    public ParentObject() 
    { 
     ChildSetOne = new List<ChildObjectOne>(); 
     ChildSetTwo = new List<ChildObjectTwo>(); 
    } 
    // 1) Although its possible to do this without this Id property, For sanity it is advisable. 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<ChildObjectOne> ChildSetOne {get; private set;} 
    public ICollection<ChildObjectTwo> ChildSetTwo { get; private set; } 
} 

public class ChildObjectOne 
{ 
    // 2a) Need a ParentId 
    public int ParentId { get; set; } 
    public string Name { get; set; } 
} 

public class ChildObjectTwo 
{ 
    // 2b) This ParentId is not required but again for sanity it is advisable to include it. 
    public int ParentId { get; set; } 
    public int id { get; set; } 
    public string LocationName { get; set; } 
} 

public class Repository 
{ 
    public IEnumerable<ParentObject> Get() 
    { 
     string sql = 
      @"SELECT 
       p.Id, 
       p.Name, 
       o.Name, 
       o.ParentId, 
       t.Id, 
       t.LocationName, 
       t.ParentId 
      FROM 
       Parent p 
        LEFT JOIN ChildOne o on o.ParentId = p.Id 
        LEFT JOIN ChildTwo t on t.ParentId = p.Id 
      WHERE 
       p.Name LIKE '%Something%'"; 

     var lookup = new Dictionary<int, ParentObject>(); 
     using (var connection = CreateConnection()) 
     { 

      connection.Query<ParentObject, ChildObjectOne, ChildObjectTwo, ParentObject>(
       sql, (parent, childOne, childTwo) => 
       { 
        ParentObject activeParent; 

        if (!lookup.TryGetValue(childOne.ParentId, out activeParent)) 
        { 
         activeParent = parent; 
         lookup.add(activeParent.Id, activeParent); 
        } 

        //TODO: if you need to check for duplicates or null do so here 
        activeParent.ChildSetOne.Add(childOne); 

        //TODO: if you need to check for duplicates or null do so here 
        activeParent.ChildSetTwo.Add(childTwo); 

       }); 
     } 
     return lookup.Values; 
    } 
} 
関連する問題