[英]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。
因此, ExecuteSqlCommand
為Insert
, Update
, Delete
等查詢返回一個int,它表示受單個非查詢影響的行數。 所以ExecuteSqlCommand
不適合查詢。
這也是一個常見問題,因為實體框架不能支持開箱即用的存儲過程返回值 ,這是因為EF是ORM,而不是SQL替換。 在Model First中檢查以下鏈接是否存在類似問題:
這與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.