gpt4 book ai didi

c# - 如何使用 Dapper 从多个表加载实体?

转载 作者:行者123 更新时间:2023-12-04 16:42:09 26 4
gpt4 key购买 nike

在我的应用程序中,我使用实体作为数据库表示中的表格。

我有一个 OrderEntity,它有 ProductEntity、CustomerEntity 等字段,然后 CustomerEntity 有 AddressEntity 等字段。

现在我尝试让 OrderEntity 填充所有实体类型属性等等。看起来我必须从 8 个表中加载数据。

我只是不知道如何正确地做到这一点。我有一个带有 Get 方法的 OrderRepository,我想在其中返回 OrderEntity。那么我是否应该创建带有 7 个连接的 SQL,一个包含 SQL 中所有列的类,然后在此存储库的 Get 方法中执行 SQL 创建手动 OrderEntity 等?

当我必须获取/更新 1 个表时,使用存储库等很容易,但是当模型由 1-2 个以上的表构建时,这对我来说变得非常困难。

最佳答案

选项 1:

我使用的方法是单独加载每个关系(对于小的 N 个表)。如果您有 8 个表,那么 8 个查询将提供您需要的所有数据。这是 3 个表的人为示例。

public class Person
{
public int PersonID { get; set; }
public string PersonName { get; set; }

public Address[] Addresses { get; set; }
}

public class Address
{
public int AddressID { get; set; }
public int PersonID { get; set; }
public string AddressLine1 { get; set; }
public string City{ get; set; }
public string StateCode { get; set; }
public string PostalCode { get; set; }

public Note[] Notes { get; set; }
}

public class Note
{
public int AddressID { get; set; }
public int NoteID { get; set; }
public string NoteText { get; set; }
}

您将查询每个表。
var people = conn.Query<Person>("select * from Person where ...");
var personIds = people.Select(x => x.PersonID);

var addresses = conn.Query<Address>("select * from Address where PersonID in @PersonIds", new { personIds });
var addressIds = addresses.Select(x => x.AddressID);

var notes = conn.Query<Note>("select * from Note where AddressID in @AddressIds", new { addressIds });

然后,一旦您拥有所有数据,将其连接起来以修复您加载的这些记录之间的关系。
// Group addresses by PersonID
var addressesLookup = addresses.ToLookup(x => x.PersonID);
// Group notes by AddressID
var notesLookup = notes.ToLookup(x => x.AddressID);

// Use the lookups above to populate addresses and notes
people.Each(x => x.Addresses = addressesLookup[x.PersonID].ToArray());
addresses.Each(x => x.Notes = notesLookup[x.AddressID].ToArray());

还有其他方法,但一个 View 可能无法满足所有条件,尤其是在给定复杂关系的情况下,会导致记录激增。

选项 2:

从以下链接,您可以使用 QueryMultiple。

https://medium.com/dapper-net/handling-multiple-resultsets-4b108a8c5172

代码如下,您的子查询必须选择所有记录。
var results = conn.QueryMultiple(@"
SELECT Id, CompanyId, FirstName, LastName FROM dbo.Users WHERE LastName = 'Smith';
SELECT Id, CompanyName FROM dbo.Companies WHERE CompanyId IN ( SELECT CompanyId FROM dbo.Users WHERE LastName = 'Smith' );
");
var users = results.Read<User>();
var companies = results.Read<Company>();

然后您将修复关系,如 选项 1 .

关于c# - 如何使用 Dapper 从多个表加载实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58509339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com