繁体   English   中英

如何通过dapper传递XML字符串作为查询的参数?

[英]How can I pass an XML string as a parameter of a query via dapper?

我需要使用Dapper将成千上万个ID的列表作为参数传递给查询。

即使没有WRT限制,您可以发送到SQL Server 的参数数量 ,遍历集合并创建大量参数也是一个不明智的解决方案。

幸运的是,我已经看到您可以发送一个XML字符串,查询可以使用XTbl.value和.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类读取它-检查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();
        }

也许这对其他人会有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM