在Dapper中,映射和包含列表的对象的最佳方法是什么,每个列表项都有自己的列表?
class Object1 {
int Object1Id;
List<Object2> object2s;
}
class Object2 {
int Object2Id;
List<Object3> object3s;
}
class Object3 {
int Object3Id;
}
这是我想要使用的SQL
SELECT *
FROM [Object1] o1
left join [Object2] o2 on o1.Object1Id = o2.Object1Id
left join [Object3] o3 on o2.Object2Id = o3.Object2Id
使用Left连接因为Object1可能没有Object2,而Object2可能没有任何Object3
我想过要用
connection.Query<Object1, Object2, Object3, Object1>
但是跟踪字典中的字典以将它们添加到列表中似乎是很多代码行。
使用QueryMultiple会更好吗?
你是绝对正确的:这种父子处理不是一个小巧玲珑处理的场景。如果它确实会很好,但它并不是最重要的事情。
您可以选择两种不优雅的解决方案。我个人认为QueryMultiple
方法更加清晰。
如果您使用的是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);
}
}
}
表演也很好。