实体框架ExecuteSQLCommand返回XML字符串

时间:2013-10-23 08:25:15

标签: xml linq entity-framework linq-to-sql linq-to-entities

我有以下代码:

_sql += "SELECT [CodeListNumber] as '@Number'"
_sql += "      ,[ShortDescription]"
_sql += "      ,[ExpiryDate]"
_sql += "      ,[CompositeCode]"
_sql += "  FROM [Aviva_Guidewire_Dev_V3].[dbo].[Aviva_CompleteCodeList] as [CodeListNumber]"
_sql += "  order by [CodeListNumber]"
_sql += "  for xml path('CodeList'), root('CodeLists'), elements"

Dim params As String()
Dim _Rtn As String = _dbRoot.Database.ExecuteSqlCommand(_sql, params)
Dim _xDoc As New XmlDocument
_xDoc.LoadXml(_Rtn)

如果我直接在SSMS中运行上面的SQL语句,它会返回一个名为XML_ [some guid]的值。

当我在VS 2012中运行代码时,值_Rtn为-1,这就是我得到的全部内容。我可以看到ExecuteSQLCommand可以有一个parms数组,但我不确定在这种情况下我应该做什么。

我应该将代码更改为存储过程并只调用它吗?

或者有人可以告诉我如何使用Linq to Entities或Linq to SQL创建相同的代码。

由于

2 个答案:

答案 0 :(得分:0)

通过在查询中指定FOR XML子句,您将SQL查询的结果检索为Sql Server XML datatype,而不是字符串

Database.ExecuteSqlCommand执行用于创建或修改数据库结构或插入,删除和更新数据的命令。即不查询。

对于您需要的查询Database.SqlQuery。它将返回给定类型的元素,但xml不是基本类型,因此它不能与查询一起使用。如果需要xml将sql server中的查询返回的xml序列化为字符串,或者删除FOR XML子句并创建一个类型,其属性与查询返回的列的名称相匹配。然后将在C#代码中创建的实例序列化为xml。

答案 1 :(得分:0)

我找到了感兴趣的其他人的解决方案。

将SQL直接移动到存储过程:

CREATE PROCEDURE [dbo].[CompleteListofCodes]
    -- Add the parameters for the stored procedure here
    -- <@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, 
    -- <@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
SELECT [CodeListNumber] as '@Number'
      ,[ShortDescription]
      ,[ExpiryDate]
      ,[CompositeCode]
  FROM [DB_V3].[dbo].[CompleteCodeList] as [CodeListNumber]
  order by [CodeListNumber]
  for xml path('CodeList'), root('CodeLists'), elements

END

然后我在EF模型中添加函数后调用存储过程。

Dim _Rtn As String() = _dbRoot.CompleteListofCodes().Array
Dim _BuildXML as string =Nothing
For Each _Element as string in _Rtn
    _BuildXML += _Element.ToString()
Next
Dim _xDoc As New XmlDocument
_xDoc.LoadXml(_BuildXML)

由于返回的数组字符串似乎有2K限制,我只是连接它们以生成要在LoadXML语句中使用的最终字符串。

Simples!