返回 XML 的 Linq 存储过程

问题描述 投票:0回答:3

我正在使用实体框架代码优先方法。我想从

DbContext
类调用存储过程并获取 XML 输出。

存储过程(SQL Server):

CREATE PROCEDURE xml_test    
AS
BEGIN
    DECLARE @xml1 xml

    SET @xml1 = (SELECT * from Product FOR XML RAW) 

    SELECT @xml1 AS my_xml
END

LINQ 实体框架:

using (DBContext db = new DBContext())
{
    var ProductList = await db.Database.ExecuteSqlCommandAsync("exec xml_test");
}

此处

ProductList
列表返回 -1。

我想获取存储过程返回的xml输出。

注意:我也尝试过类似的方法:ExecuteSqlCommand、SqlQuery,但没有任何帮助。

c# xml entity-framework linq stored-procedures
3个回答
5
投票

我认为你可以像这样使用

SQLQuery

using (var dbcontext = new DBContext())
{
    //Reading stored procedure results as List<string>
    var r = dbcontext.Database.SqlQuery<string>("EXEC xml_test").ToList(); //Note: EXEC is optional

    //Joining strings to one string that causes in resulting long strings
    var xmlString = string.Join("", r);

    //Now you can load your string to a XmlDocument
    var xml = new XmlDocument();

    //Note: You need to add a root element to your result
    xml.LoadXml($"<root>{xmlString}</root>");
}

注意:要从存储过程中获取记录,您需要在

SET NOCOUNT ON;
之后添加
BEGIN
;)。

CREATE PROCEDURE [dbo].[xml_test] 
AS
BEGIN
    SET NOCOUNT ON;

    SELECT * from dbo.AspNetUsers FOR XML RAW;
END

4
投票

正如 shA.t 提到的“FOR XML”可以使用。然而,使用时需要注意的一件事是字符串/XML(通过 EF 函数调用后返回)被截断为大约 2k 个字符,要处理这种情况,您可以查看this。此外,如果代码设计允许,您甚至可以将 Ouptput 参数与实体框架一起使用。


2
投票

Database.ExecuteSqlCommand
执行用于 CRUD 操作的命令,而不是查询。

使用

Database.SqlQuery
用于查询。它将返回给定类型的元素,但
xml
不是原始类型,这可能是 LINQ 无法工作的原因。尝试在存储过程中使用
cast
xml 来
nvarchar(max)
这将是字符串类型。

。所以你的存储过程应该是这样的:

    CREATE PROCEDURE xml_test    
AS
BEGIN
    DECLARE @xml1 xml

    SET @xml1 = (SELECT * from Product FOR XML RAW) 

    SELECT CAST(@xml1 as nvarchar(max))
END
© www.soinside.com 2019 - 2024. All rights reserved.