簡體   English   中英

如何將 XML output 從存儲過程轉換為 C# ZA8CFDE6331BD59EB2AC66F8911C4B6 in Asp6

[英]How to Convert XML output from Stored Procedure to C# object in Asp Net Core

SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO ALTER PROC
[dbo].[getStateWiseCompanyDetails] AS
BEGIN
With Data
     AS (SELECT Companies.RegionId,
                Companies.Code,
                Companies.CompanyName,
                Users.FirstName,
                Companies.OfficePhone
         FROM Companies
              INNER JOIN Users ON Companies.DirectorId = Users.Id)
     SELECT States.Id AS RegionId,
            States.StateName,
            States.IsRegion AS Status,
            Users.FirstName + ' ' + Users.LastName AS RegionDirector,
            Users.PhoneNumber,
     (
         SELECT *
         FROM Data
         WHERE data.RegionId = States.Id FOR XML PATH('CompanyList'), ROOT('StateWiseCompany'), TYPE
     ) AS CompanyList
     FROM States
          INNER JOIN Users ON States.RegionDirector = Users.Id;
END;

存儲過程的實際 Output

在此處輸入圖像描述

最后一列將包含這些信息

在此處輸入圖像描述 我想在我的 dot net Core Web 應用程序中調用這個存儲過程。

根據您的描述,如果您已經使用 EF Core 創建數據庫並且可以使用_dbContext.<yourdbsetclass>.FromSqlRaw方法接收存儲過程數據。 我建議您可以嘗試為 EF 創建一個自定義ValueConverter來滿足您的要求。

當您使用 EF 內核從 sqldatbase 獲取數據時,valueconvert 可以將字符串轉換為 object,當您要將數據插入數據庫時,會將 object 轉換為字符串。

更多細節,您可以參考以下代碼:

首先,您應該創建 StateWiseCompany class

[XmlRoot(ElementName = "CompanyList")]
public class CompanyList
{
    [XmlElement(ElementName = "RegionId")]
    public string RegionId { get; set; }
    [XmlElement(ElementName = "Code")]
    public string Code { get; set; }
    [XmlElement(ElementName = "CompanyName")]
    public string CompanyName { get; set; }
    [XmlElement(ElementName = "FirstName")]
    public string FirstName { get; set; }
    [XmlElement(ElementName = "OfficePhone")]
    public string OfficePhone { get; set; }
}

[XmlRoot(ElementName = "StateWiseCompany")]
public class StateWiseCompany
{
    [XmlElement(ElementName = "CompanyList")]
    public List<CompanyList> CompanyList { get; set; }
}

其次,您應該創建轉換器 class:

public class ObjectToDbStringEquivalentConvertor<T> : ValueConverter<T, string>
{
    public ObjectToDbStringEquivalentConvertor(ConverterMappingHints mappingHints = null) : base(convertToProviderExpression, convertFromProviderExpression, mappingHints)
    { }

    private static Expression<Func<T, string>> convertToProviderExpression = x => ToDbString(x);
    private static Expression<Func<string, T>> convertFromProviderExpression = x => ToObject<T>(x);

    public static string ToDbString<T>(T obj)
    {

        using (var stringwriter = new System.IO.StringWriter())
        {
            var serializer = new XmlSerializer(typeof(T));
            serializer.Serialize(stringwriter, obj);
            return stringwriter.ToString();
        }

     }

    public static T ToObject<T>(string stringValue)
    {
        if (stringValue != string.Empty)
        {
            using (var stringReader = new System.IO.StringReader(stringValue))
            {
                var serializer = new XmlSerializer(typeof(T));
                var re = serializer.Deserialize(stringReader);
                return (T)re;
            }
        }
        else
        {
            throw new Exception();
        }
  
    }



}

第三,您應該將 dbcontext 模型的屬性類型從字符串修改為 object。

public class Organization
{
    [Key]
    public int OrgID { get; set; }
    public StateWiseCompany OrgName { get; set; }
}

第四,我建議您應該修改 dbcontext 以覆蓋 OnModelCreating 方法,如下所示:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Organization>(
            entity => {
                entity.HasKey(e => e.OrgID);
                entity.Property(e => e.OrgName).HasConversion(new ObjectToDbStringEquivalentConvertor<StateWiseCompany>());
                }
           
            ) ;

    }

最后,您可以使用 EF core dbcontext 調用 SP:

        var re = _dbContext.Organizations.FromSqlRaw("EXEC [dbo].[getStateWiseCompanyDetails]").ToList();

結果:

數據庫:

在此處輸入圖像描述

查詢結果:

在此處輸入圖像描述

暫無
暫無

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

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