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表中的列名匹配。测试表仅包含一个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的join语句,一次用于产品id的其他join,但是,您看到的这些列的名称不同。那会不会给小巧玲珑的人带来麻烦?为了使这些查询正常工作,我是否必须进入数据库并将诸如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;
}
}