簡體   English   中英

Linq存儲過程返回XML

[英]Linq stored procedure to return XML

我正在使用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沒有幫助。

基於MSDN

對於UPDATE,INSERT和DELETE語句,返回值是受命令影響的行數。 當插入或更新的表上存在觸發器時,返回值包括插入或更新操作影響的行數以及受觸發器或觸發器影響的行數。 對於所有其他類型的語句,返回值為-1。 如果發生回滾,則返回值也為-1。

因此, ExecuteSqlCommandInsertUpdateDelete等查詢返回一個int,它表示單個非查詢影響數。 所以ExecuteSqlCommand不適合查詢。

這也是一個常見問題,因為實體框架不能支持開箱即用的存儲過程返回值 ,這是因為EF是ORM,而不是SQL替換。 Model First中檢查以下鏈接是否存在類似問題:

使用Entity Framework從存儲過程中獲取數據

這與ExecuteNonQuery

盡管使用了查詢字符串,但在使用sql COUNT時,ExecuteNonQuery返回-1

解決方案 :對於查詢,您需要使用Database.SqlQuery<TElement>方法:

var ProductList = db.Database.SqlQuery<string>("exec xml_test").ToList();

我想你可以像這樣使用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

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

如shA.t所述,可以使用“ FOR XML ”。 但是,使用時要注意的一件事是截斷字符串/ XML(通過EF調用函數后返回)大約2k個字符,為了處理這種情況,你可以看看這個 此外,如果代碼設計允許,您甚至可以在Enitity Framework中使用Ouptput參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM