c# - 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 才能使这些查询起作用?我想我不需要走那么远,但我真的很难解决这个问题。任何帮助,将不胜感激。
解决方案
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;
}
}
推荐阅读
- puppeteer - Puppeteer:无法选择非锚元素
- java - 无法在 Java 中找到和读取文件
- powershell - 仅对机械硬盘进行分区和格式化
- php - 填充对象数组而不每次都创建新对象
- javascript - 有没有办法强制特定的 dataTable 列在移动设备上显示?
- android - FCM 未发送通知
- python - 使用 exchangelib 更改发件人帐户
- pandas - 我想知道如何从两个不同的列中获取具有 2 个特定值的行
- mongodb - 猫鼬增量动态对象
- c# - 用于创建新 blob 容器的 Powershell 脚本不适用于 Azure 存储模拟器