使用xml参数从LINQ调用sproc

时间:2010-10-05 07:20:29

标签: sql xml linq stored-procedures

有一个现有的sproc,为了这个实验的目的,我不想改变。它目前通过非linq方法调用,如sqlcommand,并采用xml参数。

当前实施(非Linq)

xml片段,例如:

"<someTag>1</someTag><someTag>2</someTag>" 

作为字符串传递给sproc。请注意,它没有包含根元素,如

<someTags>.

在这个实现中,sproc很乐意接受这个xml片段作为字符串并且工作

LINQ实施

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

如果我添加根元素,则sproc将无效。

我想要什么

我已经知道我可以更改sproc中的xpath以使其在两种情况下都能正常工作。我不想这样做

因此,如果没有手动修改生成的代码,LINQ是否可以为此sproc生成一个不是Xelement的参数?

OR

是否有可能拥有一个具有多个根的Xelement(我怀疑它,但是它值得一试)

由于

2 个答案:

答案 0 :(得分:0)

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

如果您可以从LINQ查询中获取IEnumerable输出,则可以执行

IEnumerable<XElement> someTags; 
//someTags = your LINQ query here;
string aggregatedTags = someTags.Aggregate(string.Empty, 
    (accumulator, someTag) => string.Concat(accumulator, someTag));

答案 1 :(得分:0)

非常确定您无法更改存储过程,或者可能更改生成的代码。我能想到的唯一可能性是:

  1. 更改存储过程以使用有效的XML(一个根)。
  2. 更改存储过程以接受文本输入,只需将错误的xml作为字符串发送(如user347805建议)。
  3. 从生成的数据库代码中创建一个部分类,并使存储过程接受文本。我不确定这是否可能(可能不是),但是如果由于某种原因您无法修改存储过程,可能值得研究。
  4. 为什么用这么小的修改来修改存储过程是一件大事(为了清楚起见应该做出修复)?