【问题标题】:LINQ to SQL grouping and passing onto a viewLINQ to SQL 分组并传递到视图
【发布时间】:2012-02-08 22:22:17
【问题描述】:

我是 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 来处理所有事情。看来我要求的是一种“多列组”,link 帮助很大。

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

【问题讨论】:

    标签: asp.net linq asp.net-mvc-3 linq-group cfoutput


    【解决方案1】:

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

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

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

      b) 串联作为聚合函数: Using LINQ to concatenate strings

      c) 使用聚合和按多列分组 How to write a LINQ query combining group by and aggregates?

    在视图模型中有数据后,只需显示它。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-19
        • 2015-05-29
        • 1970-01-01
        相关资源
        最近更新 更多