0

我是 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 列的行中迭代列表一次或两次,而不是在大多数示例中只显示一次组键并迭代所有内容我懂了。

4

2 回答 2

0

我不是 Linq 和 MVC 的大专家,但面对你的问题,我会:

  1. 在被告知视图应该只关注显示内容之后,处理控制器/模型中的数据准备。
  2. 我将使用这些主题的知识来解决您的特定问题:

    a) 按多列分组: Group By Multiple Columns

    b) 连接作为聚合函数: 使用 LINQ 连接字符串

    c) 使用聚合和按多列分组 如何编写组合分组和聚合的 LINQ 查询?

一旦您的视图模型中有数据,只需显示它。

于 2012-02-08T23:16:00.843 回答
0

我相信我终于找到了解决我正在寻找的东西的方法。“组加入”似乎可以轻松解决我的问题。我在此页面上找到的信息解决了它: http: //geekswithblogs.net/WillSmith/archive/2008/05/28/linq-joins-and-groupings.aspx

于 2012-11-07T21:05:45.513 回答