2017-12-06 12 views
2

Dapperでは、リストとそのリストアイテムのそれぞれに独自のリストを持つオブジェクトをマップしてオブジェクトにする最良の方法は何ですか?ここで Dapperマルチプルコレクションコレクション内コレクション

class Object1 { 
    int Object1Id; 
    List<Object2> object2s; 
} 

class Object2 { 
    int Object2Id; 
    List<Object3> object3s; 
} 

class Object3 { 
    int Object3Id; 
} 

は、私はそれが可能オブジェクト1が何Object2にの持っていないとObject2にのは持っていない可能性がありますので、左のジョイン使用

SELECT * 
    FROM [Object1] o1 
    left join [Object2] o2 on o1.Object1Id = o2.Object1Id 
    left join [Object3] o3 on o2.Object2Id = o3.Object2Id 

を使用していたSQLです私は

を使用して考えた

任意のオブジェクト3の

connection.Query<Object1, Object2, Object3, Object1> 

辞書を辞書内で追跡して追加するリストには多くのコード行があるようです。

私はQueryMultipleを使用する方が良いでしょうか?

答えて

1

あなたはこの種の親子処理は、大まかには非常にうまく処理するシナリオではありません。それができればいいと思うが、それについて何かをすることが最優先事項ではない。

あなたは2つの洗練されたソリューションを選択できます。個人的には、QueryMultipleというアプローチは、きれいに洗練されていると思います。

1

SQL Server 2016以上を使用している場合は、JSONを使用します。あなたがしたいクラスでそれをデシリアライズするのは簡単です結果としてJSONで

USE tempdb 
GO 

DROP TABLE IF EXISTS dbo.[Object1] 
DROP TABLE IF EXISTS dbo.[Object2] 
DROP TABLE IF EXISTS dbo.[Object3] 
GO 

CREATE TABLE dbo.[Object1] ([Object1Id] INT PRIMARY KEY, [Value1] NVARCHAR(100)); 
CREATE TABLE dbo.[Object2] ([Object2Id] INT PRIMARY KEY, [Object1Id] INT, [Value2] NVARCHAR(100)); 
CREATE TABLE dbo.[Object3] ([Object3Id] INT PRIMARY KEY, [Object2Id] INT, [Value3] NVARCHAR(100)); 
GO 

INSERT INTO dbo.[Object1] VALUES (1, 'Object 1 Value 1') 
INSERT INTO dbo.[Object1] VALUES (2, 'Object 1 Value 2') 
INSERT INTO dbo.[Object1] VALUES (3, 'Object 1 Value 3') 
GO       

INSERT INTO dbo.[Object2] VALUES (10, 1, 'Object 2 Value 1') 
INSERT INTO dbo.[Object2] VALUES (20, 1, 'Object 2 Value 2') 
INSERT INTO dbo.[Object2] VALUES (30, 2, 'Object 2 Value 3') 
GO      

INSERT INTO dbo.[Object3] VALUES (100, 10, 'Object 3 Value 1') 
INSERT INTO dbo.[Object3] VALUES (200, 10, 'Object 3 Value 2') 
INSERT INTO dbo.[Object3] VALUES (300, 30, 'Object 3 Value 3') 
GO 

SELECT 
    * 
FROM 
    [Object1] 
LEFT JOIN 
    [Object2] AS Object2s ON [Object1].Object1Id = [Object2s].Object1Id 
LEFT JOIN 
    [Object3] AS Object3s ON [Object2s].Object2Id = [Object3s].Object2Id 
WHERE 
    [Object1].Object1Id = 1 
FOR 
    JSON AUTO,WITHOUT_ARRAY_WRAPPER 

:あなたはこのように、JSONドキュメントとしてデータを返すことができ

class Program 
{ 
    class Object1 { 
     public int Object1Id; 
     public List<Object2> Object2s; 
    } 

    class Object2 { 
     public int Object2Id; 
     public List<Object3> Object3s; 
    } 

    class Object3 { 
     public int Object3Id; 
    } 

    static void Main(string[] args) 
    { 
     using(var conn = new SqlConnection("Data Source=localhost; Initial Catalog=tempdb; Integrated Security=SSPI")) 
     { 
      var json = conn.ExecuteScalar<string>(@"    
       SELECT 
        * 
       FROM 
        [Object1] 
       LEFT JOIN 
        [Object2] AS Object2s ON [Object1].Object1Id = [Object2s].Object1Id 
       LEFT JOIN 
        [Object3] AS Object3s ON [Object2s].Object2Id = [Object3s].Object2Id 
       WHERE 
        [Object1].Object1Id = 1 
       FOR 
        JSON AUTO,WITHOUT_ARRAY_WRAPPER 
      ");         

      var result = JsonConvert.DeserializeObject<Object1>(json.Replace("\"", "'")); 

      Console.WriteLine(result.Object2s.Count); 
     } 
    } 
} 

パフォーマンスも非常に優れています。

+0

これは本当にクールです。私はそれを試してみる必要があります。ありがとう! – user3093582