C# 在ASP.NET中将平面表从存储过程转换为层次结构的简单方法
我对编程相当陌生,<2年。我正在尝试使用一个平面表,它目前是MS-SQL中的一个存储过程,并将其转换为一个复杂的数据结构。我试图完成的是返回项目不同版本的所有更改 以下是我目前拥有的模型类: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
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
。我建议它应该填充与该版本相关的最新发布日期。您可以使用LINQGroupBy
和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()
,它给出了不同的值。非常感谢。:)