首页 > 解决方案 > Dapper sql select查询与join语句,多重映射错误

问题描述

dapper 新手,很难弄清楚如何完成此查询。我已经查看了他们网站和 SO 上的其他示例,但我仍然很难将它们放在一起。

我的 sql 数据库中有以下存储过程。

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    SELECT tests.id AS tests_id, tester.name AS tester_name, product.name AS prod_name, product.version 
    FROM tests JOIN tester ON tests.tester_id =  tester.id 
    JOIN product ON tests.product_id = product.id;
END

这是我的 Test 类以及我的 Product 和 Tester 类。Tester 和 Product 类的属性在命名方面与 tester 和 product 表中的列名匹配。Tests 表只包含一个 id、tester_id(fk) 和 product_id(fk)。

public class Test
{
    public int Id { get; set; }
    public Tester Tester { get; set; }
    public Product Product { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Version { get; set; }
}

public class Tester
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我正在尝试运行此存储过程并填充我的 Test 对象。

public List<Test> GetTests()
{
    using (IDbConnection connection = new SqlConnection(Helper.CnnVal("pqual_db")))
    {
        connection.Open();
        var output = connection.Query<Test, Product, Tester, Test>("pqual_db.sptests_GetTests", (tests, products, tester) => { tests.Product = products; tests.Tester = tester; return tests; }).ToList();
        return output;
    }
}

我目前收到 ArgumentException,“使用多映射 API 时,如果您有除 id 参数名称:splitOn 以外的键,请确保设置 splitOn 参数。” 我认为 splitOn 参数应该在这里使用两次,一次用于有关测试人员 ID 的连接语句,一次用于另一个连接用于产品 ID,但是,如您所见,我将这些列命名为不同的名称。这不会给 dapper 带来问题吗?我是否必须进入我的数据库并将诸如 tester.id 之类的表的 PK 重命名为 tester.tester_id 才能使这些查询起作用?我想我不需要走那么远,但我真的很难解决这个问题。任何帮助,将不胜感激。

标签: c#sql-serverdapper

解决方案


splitOn您可以尝试像这样在属性中指定列名吗

public List<Test> GetTests()
{
    using (IDbConnection connection = new SqlConnection(Helper.CnnVal("pqual_db")))
    {
        connection.Open();
        var output = connection.Query<Test, Product, Tester, Test>("pqual_db.sptests_GetTests", (tests, products, tester) => 
    { 
      tests.Product = products; 
      tests.Tester = tester; 
      return tests; 
    }, splitOn:"tester_id,product_id ").ToList();
     return output;
    }
}

推荐阅读