2016-06-16 36 views
1

我一直在使用Dapper的一件事是将来自我们数据库的XML数据转换为字符串,然后按照我需要的方式在给定对象内反序列化它。Dapper是否将XML数据拆分为字符串列表?

我今天遇到了一些东西,其中dapper返回了包含XML的字符串列表,只有它被拆分了。这是打算?如果我期待返回单个字符串的xml,我应该编码吗?

下面是我如何调用proc,如果您执行proc,它将返回包含XML数据的单个结果,但dapper会在结果中返回2个字符串。如果我将它们连接起来,那么我可以得到我期待的结果,但这看起来不像是我应该连接的东西。

var result = conn.Query<string>(procName, parameters, commandType: CommandType.StoredProcedure); 

编辑:每个评论请求,这里是正在返回的存储过程和示例数据。这只有在XML数据达到一定大小后才会发生。小批量的XML数据不会导致这种情况发生。这里提供的示例应该有足够的数据来触发它发生。

usp_ListAllGroups

SELECT 
    (SELECT ClassificationItemID AS '@ID', GroupCN AS '*' 
     FROM UserGroup WITH (NOEXPAND) 
     FOR XML PATH('Group'), TYPE) 
    FOR XML PATH('Groups'); 

结果XML

<Groups> 
    <Group ID="4">SomeGroupName</Group> 
    <Group ID="9">SomeGroupName</Group> 
    <Group ID="2">SomeGroupName</Group> 
    <Group ID="553">SomeGroupName</Group> 
    <Group ID="447">SomeGroupName</Group> 
    <Group ID="435">SomeGroupName</Group> 
    <Group ID="395">SomeGroupName</Group> 
    <Group ID="489">SomeGroupName</Group> 
    <Group ID="468">SomeGroupName</Group> 
    <Group ID="408">SomeGroupName</Group> 
    <Group ID="455">SomeGroupName</Group> 
    <Group ID="443">SomeGroupName</Group> 
    <Group ID="524">SomeGroupName</Group> 
    <Group ID="414">SomeGroupName</Group> 
    <Group ID="430">SomeGroupName</Group> 
    <Group ID="423">SomeGroupName</Group> 
    <Group ID="511">SomeGroupName</Group> 
    <Group ID="482">SomeGroupName</Group> 
    <Group ID="154">SomeGroupName</Group> 
    <Group ID="236">SomeGroupName</Group> 
    <Group ID="244">SomeGroupName</Group> 
    <Group ID="367">SomeGroupName</Group> 
    <Group ID="547">SomeGroupName</Group> 
    <Group ID="134">SomeGroupName</Group> 
    <Group ID="309">SomeGroupName</Group> 
    <Group ID="26">SomeGroupName</Group> 
    <Group ID="128">SomeGroupName</Group> 
    <Group ID="335">SomeGroupName</Group> 
    <Group ID="322">SomeGroupName</Group> 
    <Group ID="164">SomeGroupName</Group> 
    <Group ID="190">SomeGroupName</Group> 
    <Group ID="30">SomeGroupName</Group> 
    <Group ID="121">SomeGroupName</Group> 
    <Group ID="276">SomeGroupName</Group> 
    <Group ID="260">SomeGroupName</Group> 
    <Group ID="83">SomeGroupName</Group> 
    <Group ID="71">SomeGroupName</Group> 
    <Group ID="591">SomeGroupName</Group> 
    <Group ID="358">SomeGroupName</Group> 
    <Group ID="179">SomeGroupName</Group> 
    <Group ID="113">SomeGroupName</Group> 
    <Group ID="148">SomeGroupName</Group> 
    <Group ID="299">SomeGroupName</Group> 
    <Group ID="209">SomeGroupName</Group> 
    <Group ID="229">SomeGroupName</Group> 
    <Group ID="8">SomeGroupName</Group> 
    <Group ID="54">SomeGroupName</Group> 
    <Group ID="40">SomeGroupName</Group> 
    <Group ID="3">SomeGroupName</Group> 
    <Group ID="1">SomeGroupName</Group> 
</Groups> 
+0

我认为这与Dapper Streaming API有关。你能提供更多关于存储过程的信息吗? – supertopi

+0

@supertopi更新了包含更多信息的答案。 – akousmata

+0

你使用什么数据库? Dapper不应该那样做;但数据库本身可能。 –

回答

0

为了从存储过程读取你的XML,你可以使用它返回的2,033个字符行SqlCommand.ExecuteXmlReader方法。这是设计。我没有看过Dapper代码,但从我的测试中看来,Dapper已经实现了这个非常酷的代码。

+0

我相信你的建议是不正确的。 'SqlCommand.ExecuteXmlReader'返回整个xml流,而不是行的字符。 https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executexmlreader(v=vs.110).aspx我在Dapper的代码中没有看到它们检索xml流的地方。如果他们是那么你会是正确的,我的问题不会发生。 – akousmata