如何在Asp Net内核中将存储过程的XML输出转换为C#对象

如何在Asp Net内核中将存储过程的XML输出转换为C#对象,c#,sql-server,asp.net-core,ef-core-2.2,ef-core-3.1,C#,Sql Server,Asp.net Core,Ef Core 2.2,Ef Core 3.1,存储过程的实际输出 将包含这些信息的最后一列 我想在我的dot net Core Web应用程序中调用此存储过程。根据您的描述,如果您已经使用EF Core创建了数据库,并且可以使用\u dbContext..FromSqlRaw方法接收存储过程数据。我建议您可以尝试为EF创建一个定制,以满足您的需求 当您使用EF core从sqldatbase获取数据时,valueconvert可以将字符串转换为对象,当您希望将数据插入数据库时,valueconvert会将对象转换为字符串 更多详细信息,

存储过程的实际输出

将包含这些信息的最后一列


我想在我的dot net Core Web应用程序中调用此存储过程。

根据您的描述,如果您已经使用EF Core创建了数据库,并且可以使用
\u dbContext..FromSqlRaw
方法接收存储过程数据。我建议您可以尝试为EF创建一个定制,以满足您的需求

当您使用EF core从sqldatbase获取数据时,valueconvert可以将字符串转换为对象,当您希望将数据插入数据库时,valueconvert会将对象转换为字符串

更多详细信息,请参考以下代码:

首先,您应该创建StateWiseCompany类

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;
第四,我建议您修改dbcontext以覆盖OnModelCreating方法,如下所示:

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

数据库:

查询结果:


欢迎来到Stackoverflow。请以文本而不是图片的形式共享您的代码。您能告诉我您现在使用了哪个sql库吗?EF核心?否则呢?你知道如何从数据库中获取数据吗?或者您只是想知道如何将xml转换为对象?谢谢,它已经成功了。我们可以只用两个类来完成吗?
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();
        }
  
    }



}
public class Organization
{
    [Key]
    public int OrgID { get; set; }
    public StateWiseCompany OrgName { get; set; }
}
    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>());
                }
           
            ) ;

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