Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET中将平面表从存储过程转换为层次结构的简单方法_C#_Asp.net - Fatal编程技术网

C# 在ASP.NET中将平面表从存储过程转换为层次结构的简单方法

C# 在ASP.NET中将平面表从存储过程转换为层次结构的简单方法,c#,asp.net,C#,Asp.net,我对编程相当陌生,new ReleaseNote { ReleaseVersion=行[“ReleaseVersion”]。ToString(), ReleaseDate=DateTime.Parse(行[“ReleaseDate”].ToString()) }).Distinct().ToList(); //枚举版本并生成RELEASENOTEITEMS versions.ForEach(版本=> { //获取属于此版本号的行的列表 var rows=data.AsEnumerable().W

我对编程相当陌生,<2年。我正在尝试使用一个平面表,它目前是MS-SQL中的一个存储过程,并将其转换为一个复杂的数据结构。我试图完成的是返回项目不同版本的所有更改

以下是我目前拥有的模型类:

public class ReleaseNote
    {
        public string ReleaseVersion { get; set; }
        public DateTime ReleaseDate { get; set; }
        public List<ReleaseNoteItems> ReleaseNoteItems { get; set; }
    }

    public class ReleaseNoteItems
    {
        public string ChangeType { get; set; }
        public List<string> Changes { get; set; }
    }
公共类发布说明
{
公共字符串ReleaseVersion{get;set;}
公共日期时间释放日期{get;set;}
公共列表ReleaseNoteItems{get;set;}
}
公共类ReleaseNoteItems
{
公共字符串ChangeType{get;set;}
公共列表更改{get;set;}
}
这是DAL类中的业务逻辑:

public IEnumerable<ReleaseNote> GetAllReleaseNotes()
        {
            string cmdText = ConfigurationManager.AppSettings["ReleaseNotesAll"];
            Func<DataTable, List<ReleaseNote>> transform = releaseNoteTransform;
            return getRecords<ReleaseNote>(cmdText, transform);
        }

        public List<ReleaseNote> releaseNoteTransform(DataTable data)
        {
            //DISTINCT LIST OF ALL VERSIONS (PARENT RECORDS)
            var versions = data.AsEnumerable().Select(row => new ReleaseNote
            {
                ReleaseVersion = row["ReleaseVersion"].ToString(),
                ReleaseDate = DateTime.Parse(row["ReleaseDate"].ToString())
            }).Distinct().ToList();

            //ENUMERATE VERSIONS AND BUILD OUT RELEASENOTEITEMS
            versions.ForEach(version =>
            {
                //GET LIST OF ROWS THAT BELONG TO THIS VERSION NUMBER
                var rows = data.AsEnumerable().Where(row => row["ReleaseVersion"].ToString() == version.ReleaseVersion).ToList();
                //GET DISTINCT LIST OF CHANGE TYPES IN THIS VERSION
                var changeTypes = rows.Select(row => row["ChangeType"].ToString()).Distinct().ToList();

                //INSTANTIATE LIST FOR RELEASENOTE ITEMS
                version.ReleaseNoteItems = new List<ReleaseNoteItems>();

                //ENUMERATE CHANGE TYPES AND CREATE THEM
                changeTypes.ForEach(changeType =>
                {
                    //FILTER FOR CHANGES FOR THIS SPECIFIC CHANGE TYPE AND PROJECT TO LIST<STRING>
                    var changes = rows.Where(row => row["ChangeType"].ToString() == changeType)
                                      .Select(row => row["ReleaseNote"].ToString()).ToList();

                    //CREATE THE ITEM AND POPULATE IT
                    var releaseNoteDetail = new ReleaseNoteItems();
                    releaseNoteDetail.ChangeType = changeType;
                    releaseNoteDetail.Changes = changes;
                    version.ReleaseNoteItems.Add(releaseNoteDetail);
                });
            });

            return versions;
        }
public IEnumerable GetAllReleaseNotes()
{
string cmdText=ConfigurationManager.AppSettings[“ReleaseNotesAll”];
Func transform=releaseNoteTransform;
返回getRecords(cmdText、transform);
}
公共列表releaseNoteTransform(数据表数据)
{
//所有版本的不同列表(父记录)
var versions=data.AsEnumerable().选择(行=>new ReleaseNote
{
ReleaseVersion=行[“ReleaseVersion”]。ToString(),
ReleaseDate=DateTime.Parse(行[“ReleaseDate”].ToString())
}).Distinct().ToList();
//枚举版本并生成RELEASENOTEITEMS
versions.ForEach(版本=>
{
//获取属于此版本号的行的列表
var rows=data.AsEnumerable().Where(row=>row[“ReleaseVersion”].ToString()==version.ReleaseVersion.ToList();
//获取此版本中更改类型的不同列表
var changeTypes=rows.Select(row=>row[“ChangeType”].ToString()).Distinct().ToList();
//实例化RELEASENOTE项的列表
version.ReleaseNoteItems=新列表();
//枚举更改类型并创建它们
changeTypes.ForEach(changeType=>
{
//筛选此特定更改类型和要列出的项目的更改
var changes=行。其中(行=>行[“ChangeType”]。ToString()==ChangeType)
.Select(row=>row[“ReleaseNote”].ToString()).ToList();
//创建项目并填充它
var releaseNoteDetail=新的ReleaseNoteItems();
releaseNoteDetail.ChangeType=ChangeType;
releaseNoteDetail.Changes=更改;
version.ReleaseNoteItems.Add(releaseNoteDetail);
});
});
返回版本;
}
我目前正在使用Postman返回一个JSON对象,我目前遇到的问题是,它没有返回唯一的对象或发布版本,它仍然给我重复的对象

这些是我看过的一些链接。我发现没有一个能为我正在使用的具体实现提供解决方案。我尝试过不同的实现,但它们似乎超出了我试图实现的框架

如果你需要更多信息,请告诉我。我试着按照提问程序来做,但我肯定我遗漏了一些东西

提前谢谢


听起来您的数据有重复项。给定的
ReleaseVersion
可能有多条记录。当您在示例中使用
DISTINCT
时,您在{
ReleaseVersion
ReleaseDate
}上强制唯一性,这显然不够好

如果您想拥有与
ReleaseVersion
相关的唯一行,则需要了解当存在多个可能值时如何填充
ReleaseDate
。我建议它应该填充与该版本相关的最新发布日期。您可以使用LINQ
GroupBy
Max
强制执行该逻辑,如下所示:

var uniqueRows = dt.AsEnumerable()
                   .GroupBy(row   => row["ReleaseVersion"])
                   .Select (group => new ReleaseNote 
                                     { 
                                         ReleaseVersion = group.Key as string, 
                                         ReleaseDate    = group.Max(row => (DateTime)row["ReleaseDate"]) 
                                     }
                           );

此LINQ将为每个发布版本创建一行。给定发布版本,发布日期将填充最新(最大)发布日期。

基础数据中是否存在重复项?例如,是否有两条记录的ReleaseVersion值相同,但ReleaseDate值不同?嘿,John,是的,这是正确的。存储过程中的平面表具有重复数据。因此,我试图在DAL类中将它们转换为唯一的JSON对象。我试着在必要的地方调用Distinct()方法,但显然我调用的地方不对。谢谢你的帮助,John。我能够实现一个GroupBy函数,并让它返回不同的值。在Select的lambda表达式中,我没有返回新的ReleaseNote,而是返回了
group=>group.First()).ToList()
,它给出了不同的值。非常感谢。:)