Linq存储过程返回XML

u0sqgete  于 2023-09-28  发布在  其他
关注(0)|答案(3)|浏览(115)

我使用的是Entity Framework代码优先的方法。我想从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无需帮助。

3pvhb19x

3pvhb19x1#

我想你可以这样使用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>");
}

注意:要从存储过程中获取记录,需要在BEGIN之后添加SET NOCOUNT ON;;).

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

    SELECT * from dbo.AspNetUsers FOR XML RAW;
END
cx6n0qe3

cx6n0qe32#

如shA.t所述,可以使用“FOR XML”。然而,在使用时需要注意的一件事是字符串/XML(通过EF函数调用后返回)的截断,大约2k个字符,为了处理这种情况,您可以查看this。如果代码设计允许,你甚至可以使用Ouptput parameters with Enitity Framework

rbpvctlc

rbpvctlc3#

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

相关问题