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;
}
}
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;
}
}