Dapper sql select query with join statement, mutli mapping error

Dapper sql select query with join statement, mutli mapping error

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

这是我的测试 class 以及我的产品和测试器 classes。 Tester 和 Product class 的属性与 tester 和 product table 中的列名以相同的命名方式匹配。测试 table 只包含一个 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; }
}

我正在尝试 运行 这个存储过程并填充我的测试对象。

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,"When using the multi-mapping API, ensure that you set the splitOn param if you have keys other than id Parameter name: splitOn." 我认为 splitOn 参数应该在这里使用两次,一次用于关于测试者 ID 的连接语句,一次用于产品 ID 的另一个连接,但是,如您所见,我将这些列命名为不同的名称。这不会给 dapper 带来问题吗?我是否必须进入我的数据库并将 table 的 PK(例如 tester.id 重命名为 tester.tester_id 才能使这些查询正常工作?我在想我不需要走那么远,但我真的不知道如何解决这个问题。任何帮助,将不胜感激。

您可以尝试在 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;
    }
}