ASP.NET MVC LINQ Grouping

本文关键字:Grouping LINQ MVC NET ASP | 更新日期: 2023-09-27 18:21:47

我正在尝试根据数据库表中的一列对多个项目进行分组。我已经梳理了无数关于这个主题的帖子,但没有运气解决我的问题。

这是我正在遵循的教程,它完全符合我的需求:http://ole.michelsen.dk/blog/grouping-data-with-linq-and-mvc/

这是我的表定义的样子:

|task_no(PK)|task_statement|field_name|

这是我试图获得的示例:

field_name 1
  task_no | task_statement
  task_no | task_statement
  task_no | task_statement
field_name 2
  task_no | task_statement
  task_no | task_statement
field_name 3
  task_no | task_statement
  task_no | task_statement

这是我的模型:

public partial class domain_names_tasks
{
    [Key]public int task_no { get; set; }
    public string task_statement { get; set; }
    public string field_name { get; set; }
}

从以下教程创建的类。

    public class Group<T, K>
{
    public K Key;
    public IEnumerable<T> Values;
}

这是我的控制器:

    public ActionResult DomainTaskStatements()
    {
        var taskStatements = context.domain_names_tasks.Select(ts => new domain_names_tasks
                                                            {
                                                                task_no = ts.task_no,
                                                                task_statement = ts.task_statement,
                                                                field_name = ts.field_name
                                                            }).ToList();
        var data = from ts in taskStatements
                   group ts by ts.field_name into tsg
                   select new Group<string, domain_names_tasks> { Key = tsg.Key, Values = tsg };
        return View(data.toList());
    }

我收到两个错误:

第一个错误

Cannot implicitly convert type 'string' to 'GeologyWebApp.Models.domain_names_tasks'    

这是在这里引起的:

Key = tsg.Key

第二个错误

Cannot implicitly convert type 'System.Linq.IGrouping<string,GeologyWebApp.Models.domain_names_tasks>' to 'System.Collections.Generic.IEnumerable<string>'. An explicit conversion exists (are you missing a cast?)

在这里引起:

Values = tsg

我是使用 LINQ 和 ASP.NET 的新手,因此对于提出有关可能易于解决的问题的问题,我深表歉意。我没有运气查看与 LINQ 分组相关的其他问题,所以我想我会发布这个问题。提前感谢!

编辑 1 -------

抱歉,我没有注意到我在 Group 类中的键和值参数上的愚蠢错误。

这是我修改后的控制器和视图,现在可以工作了。

控制器:

注意:我不得不更改我的"taskStatement"查询,因为我收到错误:"无法在 LINQ 到实体查询中构造实体"。我按照此处找到的答案来解决此问题。

    public ActionResult DomainTaskStatements()
    {
        var taskStatements = (from ts in context.Set<domain_names_tasks>()
                  select new
                  {
                      task_no = ts.task_no,
                      task_statement = ts.task_statement,
                      field_name = ts.field_name
                  }).ToList().Select(x => new domain_names_tasks { task_no = x.task_no, task_statement = x.task_statement, field_name = x.field_name });
        var data = from ts in taskStatements
                   group ts by ts.field_name into tsg
                   select new Group<string, domain_names_tasks> { Key = tsg.Key, Values = tsg };
        return View(data.ToList());
    }

视图:

@model IEnumerable<GeologyWebApp.Models.Group<string, GeologyWebApp.Models.domain_names_tasks>>
@{
    ViewBag.Title = "DomainTaskStatements";
}
<table>
    <thead><tr><th>task no</th><th>task statement</th></tr></thead>
    <tbody>
        @foreach (var group in Model)
        {
            <tr><th colspan="2">@group.Key</th></tr>
            foreach (var task in group.Values)
            {
                <tr><td>@task.task_no</td><td>@task.task_statement</td></tr>
            }
        }
    </tbody>
</table>

ASP.NET MVC LINQ Grouping

select new Group<string, domain_names_tasks> { Key = tsg.Key, Values = tsg };

应该是

select new Group<domain_names_tasks, string> { Key = tsg.Key, Values = tsg };

因为在

Group<T, K>

键 (K( 是第二个类型参数,类型 (T( 是第一个。


但是,我认为您不需要拥有自己的组类型,在 LINQ 中使用"分组依据"应该返回:

IEnumerable<IGrouping<K,T>>

您可能会在控制器中侥幸逃脱:

var data = from ts in taskStatements
           group ts by ts.field_name;

然后在视图中(对于嵌套循环(:

foreach (var task in group)

而不是

foreach (var task in group.Values)