如何通过 dapper 将 XML 字符串作为查询的参数传递?
How can I pass an XML string as a parameter of a query via dapper?
我需要使用 Dapper 将包含数千个 ID 的列表作为参数传递给查询以进行过滤。
即使没有 a limit WRT the amount of parameters 也可以发送到 SQL 服务器,遍历集合并创建大量参数是一个不优雅的解决方案。
幸运的是,我看到您可以发送一个 XML 字符串,查询可以解压该字符串 using XTbl.value and .nodes()。
但我不知道如何通过 Dapper 传递这个 XML 字符串。
最后并没有那么难,只是结合了各种知识点和一些试验和错误付出了一些努力。
这是查询的简化版本:
SELECT DISTINCT [regular_Person].[Idf] AS [Idf]
, [regular_Person].[FirstName]
, [regular_Person].[LastName]
FROM [regular].[Person] [regular_Person]
WHERE [regular_Person].[Idf] IN (
SELECT Idf
FROM (
SELECT Idf = XTbl.value('.', 'NVARCHAR(10)')
FROM @Idfs.nodes('/root/Idf') AS XD(XTbl)
) AS XmlToData
)
ORDER BY
[regular_Person].[LastName]
, [regular_Person].[FirstName]
它作为 .sql 文件嵌入到我的解决方案中,我使用我的 QueryRetriever
class 阅读它 -- 检查 https://codereview.stackexchange.com/q/214250/10582 的代码。
要传递给查询的 ID 需要转换为 XML 字符串:
var idfsAsXml = new XDocument(
new XElement("root",
excelRecords
.Select(x => x.Idf)
.Distinct()
.Select(x => new XElement("Idf", x))))
.ToString();
然后我使用 Dapper 的 DynamicParameters
创建一个参数:
var dynamicParameters = new DynamicParameters();
dynamicParameters.Add("@Idfs", idfsAsXml, DbType.Xml, ParameterDirection.Input);
然后我将该参数作为 DbType.Xml
(使用 ParameterDirection.Input
)传递:
using (var connection = new SqlConnection(_connectionString))
{
regularRecords = connection.Query<RegularRecord>(
QueryRetriever.GetQuery("GetRegularRecords.sql"),
dynamicParameters
)
.ToList();
}
也许这会对其他人有所帮助。
我需要使用 Dapper 将包含数千个 ID 的列表作为参数传递给查询以进行过滤。
即使没有 a limit WRT the amount of parameters 也可以发送到 SQL 服务器,遍历集合并创建大量参数是一个不优雅的解决方案。
幸运的是,我看到您可以发送一个 XML 字符串,查询可以解压该字符串 using XTbl.value and .nodes()。
但我不知道如何通过 Dapper 传递这个 XML 字符串。
最后并没有那么难,只是结合了各种知识点和一些试验和错误付出了一些努力。
这是查询的简化版本:
SELECT DISTINCT [regular_Person].[Idf] AS [Idf]
, [regular_Person].[FirstName]
, [regular_Person].[LastName]
FROM [regular].[Person] [regular_Person]
WHERE [regular_Person].[Idf] IN (
SELECT Idf
FROM (
SELECT Idf = XTbl.value('.', 'NVARCHAR(10)')
FROM @Idfs.nodes('/root/Idf') AS XD(XTbl)
) AS XmlToData
)
ORDER BY
[regular_Person].[LastName]
, [regular_Person].[FirstName]
它作为 .sql 文件嵌入到我的解决方案中,我使用我的 QueryRetriever
class 阅读它 -- 检查 https://codereview.stackexchange.com/q/214250/10582 的代码。
要传递给查询的 ID 需要转换为 XML 字符串:
var idfsAsXml = new XDocument(
new XElement("root",
excelRecords
.Select(x => x.Idf)
.Distinct()
.Select(x => new XElement("Idf", x))))
.ToString();
然后我使用 Dapper 的 DynamicParameters
创建一个参数:
var dynamicParameters = new DynamicParameters();
dynamicParameters.Add("@Idfs", idfsAsXml, DbType.Xml, ParameterDirection.Input);
然后我将该参数作为 DbType.Xml
(使用 ParameterDirection.Input
)传递:
using (var connection = new SqlConnection(_connectionString))
{
regularRecords = connection.Query<RegularRecord>(
QueryRetriever.GetQuery("GetRegularRecords.sql"),
dynamicParameters
)
.ToList();
}
也许这会对其他人有所帮助。