Sql 查询通过 dapper 映射到一个模型的两个列表

问题描述 投票:0回答:2

我有两张表 REQUEST 和 PERSON 请求有两列客户和律师,它们都链接到人员 现在我创建一个模型,它有两个属性,它们的类型是 Person 如何编写 TSQL 将请求和客户的联接结果映射到模型的这两个属性。

    `select request.id,personjoin1.data
                 CustomerData ,personjoin2.data LawyerData`

获取以下型号

 ` public class{
   public int requestId{get;set;}
    public Person Customer{get;set;}
   public Person Lawyer{get;set;}
   }`
sql model mapping dapper
2个回答
0
投票

您可以通过将 REQUEST 表与 PERSON 表连接两次来实现此目的,一次用于客户,一次用于律师,然后将结果映射到模型属性。以下是编写 T-SQL 查询的方法:

SELECT 
    R.id AS requestId,
    PC.data AS CustomerData,
    PL.data AS LawyerData
FROM 
    REQUEST R
JOIN 
    PERSON PC ON R.customer = PC.id
JOIN 
    PERSON PL ON R.lawyer = PL.id

这假设 REQUEST 表中的客户和律师列是引用 PERSON 表中的 id 列的外键。

现在,您可以在 C# 代码中将结果映射到模型:

public class YourModel
{
    public int requestId { get; set; }
    public Person Customer { get; set; }
    public Person Lawyer { get; set; }
}

public class Person
{
    public string data { get; set; } // Assuming 'data' is a property of Person
}

然后您需要从数据库中检索数据并将其映射到您的模型。如果您使用的是实体框架之类的框架,您可以执行以下操作:

public List<YourModel> GetRequestData()
{
    List<YourModel> result = new List<YourModel>();

    using (var dbContext = new YourDbContext())
    {
        var query = dbContext.Database.SqlQuery<YourModel>(
            @"SELECT 
                R.id AS requestId,
                PC.data AS CustomerData,
                PL.data AS LawyerData
            FROM 
                REQUEST R
            JOIN 
                PERSON PC ON R.customer = PC.id
            JOIN 
                PERSON PL ON R.lawyer = PL.id");

        result = query.ToList();
    }

    return result;
}

这假设您已在应用程序中正确设置了 DbContext 和连接。


0
投票

是的,可以使用 Dapper 将客户和律师的字段映射到您的

MyModel
类中各自的模型。您可以通过利用 Dapper 的多重映射功能来实现这一点。

具体操作方法如下:

public class MyModel
{
    public Person CustomerModel { get; set; }
    public Person LawyerModel { get; set; }
}

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    // Other properties you have in your PERSON table
}

假设您的

Person
类与您的 PERSON 表的结构匹配。

现在,您可以使用Dapper的多重映射功能将客户和律师的字段映射到各自的模型上:

public MyModel GetMyModel()
{
    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();
        
        string sql = @"
            SELECT 
                RC.id AS CustomerId,
                RC.name AS CustomerName,
                RL.id AS LawyerId,
                RL.name AS LawyerName
            FROM 
                REQUEST R
            JOIN 
                PERSON RC ON R.customer = RC.id
            JOIN 
                PERSON RL ON R.lawyer = RL.id";
        
        var result = connection.Query<MyModel, Person, Person, MyModel>(
            sql,
            (model, customer, lawyer) =>
            {
                model.CustomerModel = customer;
                model.LawyerModel = lawyer;
                return model;
            },
            splitOn: "LawyerId"
        ).FirstOrDefault();
        
        return result;
    }
}

在此示例中,使用 Dapper 的

Query
方法进行多重映射,将客户和律师的字段映射到
Person
中各自的
MyModel
对象。
splitOn
参数用于指定何时分割成下一个对象,即律师的字段何时开始(
LawyerId
)。

确保您的查询返回客户和律师中每个字段具有不同名称的列,因为 Dapper 使用这些名称来正确匹配和映射属性。

© www.soinside.com 2019 - 2024. All rights reserved.