Linq存储过程返回XML

6

我将使用Entity Framework的Code-First方法。我希望从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 Entity Framework:
using (DBContext db = new DBContext())
{
    var ProductList = await db.Database.ExecuteSqlCommandAsync("exec xml_test");
}

这里的 ProductList 列表返回了 -1。

我希望获取由存储过程返回的 xml 输出。

注意:我也尝试过方法,如使用 ExecuteSqlCommand、SqlQuery,但没有帮助。


我猜这个链接可能会有所帮助:https://dev59.com/smkv5IYBdhLWcg3wzj41。 - Shakra
3个回答

5

I think you can use SQLQuery like this:

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>");
}

注意:要从存储过程中获取记录,您需要在BEGIN后添加SET NOCOUNT ON;
CREATE PROCEDURE [dbo].[xml_test] 
AS
BEGIN
    SET NOCOUNT ON;

    SELECT * from dbo.AspNetUsers FOR XML RAW;
END

不应该需要语句中的 EXEC 部分 - 只需要 xml_test - Tieson T.
@TiesonT。谢谢,我已经添加了一条注释;) - shA.t

4

如shA.t所提到的,可以使用“FOR XML”。然而,在使用时需要注意字符串/XML(通过EF调用函数返回)在大约2k个字符处被截断。为了处理这种情况,您可以查看“this”。此外,如果代码设计允许,甚至可以使用“带有Enitity Framework的输出参数”。


2

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

使用Database.SqlQuery进行查询。它将返回给定类型的元素,但xml不是原始类型,可能是LINQ无法工作的原因。尝试在存储过程中将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

抱歉,无法转换类型。 - Pearl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接