我是 Asp.Net、MVC3、Linq 以及与之相关的所有其他内容的新手。我非常习惯 PHP 和 ColdFusion,所以请原谅我的无知!本质上,我想要做的是在 ColdFusion 中重新创建这种情况,我可以在其中执行相当于 cfoutput 的 group 属性的操作。我已经习惯了只调用一个存储过程然后做
<cfoutput group="id">
然后是具有非不同数据的任何列的另一个内部 cfoutput。奇迹般有效!在 Asp.Net 中没有那么多。
我想继续使用我的存储过程,它从具有一对多关系的两个表中返回一个连接。例如,假设我有 3 列:全名、标题和毕业年份。毕业年份是连接表中的列,所以我的存储过程结果如下所示:
吉姆教授 2005
吉姆教授 2008
吉姆教授 2011
我将这个发送到视图。我假设 View 的工作是根据其中一列(可能是全名)对数据进行分组。我想输出一个包含 3 列的 HTML 表,在这种情况下,我将有一行:
吉姆教授 2005, 2008, 2011
我已经用谷歌搜索了大量使用这个叫做组键的东西的例子。这似乎对我没有帮助,因为我对只输出一个值“Jim”(或任何分组值)不感兴趣,我需要为每一行输出“Jim”和“Professor”值。我的想法是我需要 2 个 foreach 循环,外循环显示全名和标题,内循环遍历毕业年份的所有可能匹配项。我似乎无法在一个小组中获得毕业年份,尤其是使用这种 IGrouping 语法。键只能存储一个值,我需要该行上的每个值,我只需要迭代一两个值。我是否应该在执行辅助 linq 分组后尝试创建自定义视图模型,然后将其发送到强类型视图?
编辑: 好的,我有有效的代码,但它似乎非常低效,因为我基本上必须重新定义我从存储过程中获得的所有列/值。它几乎让我想忘记存储过程,而只使用 LINQ 来处理所有事情。看来我要的是一种“多列组”,链接帮助很大。
var records = db.getRecords();
var groups = from r in records
group r by new
{
r.id
}
into row
select new ListVM()
{
id = row.Key.id,
fullname = row.Select(x => x.fullname).First(),
title = row.Select(x => x.title).First(),
degrees = row.Select(x => x.degree_name).ToList(),
majors = row.Select(x => x.major_name).ToList()
};
return View(groups);
我当然必须创建一个 ViewModel 才能工作。在我看来,我可以使用 for 循环来遍历学位和专业列表。这是最好的方法吗?我通常需要的不仅仅是组键来显示我的整行信息,并且只想在 20 列的行中迭代列表一次或两次,而不是在大多数示例中只显示一次组键并迭代所有内容我懂了。