Sql 使用xml参数从LINQ调用存储过程

Sql 使用xml参数从LINQ调用存储过程,sql,xml,linq,stored-procedures,Sql,Xml,Linq,Stored Procedures,为了本实验的目的,我不想更改现有的存储过程。它当前通过一个非linq方法(如sqlcommand)调用,并接受一个xml参数 当前实施(非Linq) xml片段,例如: "<someTag>1</someTag><someTag>2</someTag>" “12” 作为字符串传递给存储过程。请注意,它没有包含根元素,如 <someTags>. 。 在这个实现中,存储过程愉快地接受这个xml片段作为字符串并工作 LINQ实施 如

为了本实验的目的,我不想更改现有的存储过程。它当前通过一个非linq方法(如sqlcommand)调用,并接受一个xml参数

当前实施(非Linq)

xml片段,例如:

"<someTag>1</someTag><someTag>2</someTag>" 
“12”
作为字符串传递给存储过程。请注意,它没有包含根元素,如

<someTags>.
在这个实现中,存储过程愉快地接受这个xml片段作为字符串并工作

LINQ实施

如果我尝试从LINQ调用此存储过程,那么LINQ要求我必须使用Xelement。不幸的是,当前xml片段无法添加到Xelement,因为Xelement不能有多个根

如果添加根元素,存储过程将无法工作

我想要什么

我已经知道我可以在存储过程中更改xpath,使其在两种情况下都能工作。但我不想这么做

因此,在不手动修改生成的代码的情况下,是否可以让LINQ为此存储过程生成一个非Xelement的参数

有可能有一个具有多个根的Xelement吗(我对此表示怀疑,但嘿,值得一试)


谢谢

为什么需要一个具有多个根的元素?您可以使用扩展方法从
IEnumerable
生成存储过程的字符串输入

如果可以从LINQ查询中获得IEnumerable输出,则可以执行以下操作

IEnumerable<XElement> someTags; 
//someTags = your LINQ query here;
string aggregatedTags = someTags.Aggregate(string.Empty, 
    (accumulator, someTag) => string.Concat(accumulator, someTag));
IEnumerable someTags;
//someTags=您在此处的LINQ查询;
string aggregatedTags=someTags.Aggregate(string.Empty,
(acculator,someTag)=>string.Concat(acculator,someTag));

非常确定您在更改存储过程时遇到了困难,或者可能在更改生成的代码时遇到了困难。我能想到的唯一可能性是:

  • 更改存储过程以使用有效的XML(一个根)
  • 将存储过程更改为接受文本输入,并将错误的xml作为字符串发送(如user347805所示)
  • 根据生成的数据库代码创建一个分部类,并使存储过程接受文本。我不确定这是否可能(可能不可能),但无论出于何种原因,您是否绝对不能修改存储过程,都值得研究一下

  • 为什么用这么小的补丁来更改存储过程是一件大事(无论如何,为了清楚起见,应该做一个补丁)?

    很抱歉,延迟回复,生成的“LINQ to SQL”代码需要一个XElement,如果可能的话,我不想更改生成的代码。存储过程是一个已使用的存储过程,需要具有多个根的XML,以便其中的xpath工作。