Asp.net mvc linq嵌套分组方式

Asp.net mvc linq嵌套分组方式,asp.net-mvc,linq,Asp.net Mvc,Linq,我有一个评估表,其中包含{rated,rater,Assessment_id}另一个表是Category_Scores,其中包含{score,Assessment_id}。我正试图按评分员分组,按分数分组。目前我有这个LINQ查询 var query = (from a in db.Assessments join u in db.Users on a.rated equals u.user_id

我有一个评估表,其中包含{rated,rater,Assessment_id}另一个表是Category_Scores,其中包含{score,Assessment_id}。我正试图按评分员分组,按分数分组。目前我有这个LINQ查询

        var query = (from a in db.Assessments
                     join u in db.Users on a.rated equals u.user_id
                     join u2 in db.Users on a.rater equals u2.user_id
                     join tm in db.Team_Members on u.user_id equals tm.user_id
                     join t in db.Teams on tm.team_id equals t.team_id
                     join c in db.Category_Scores on a.assessment_id equals c.assessment_id
                     join cat in db.Categories on c.category_id equals cat.category_id

                     group new KyubiViewModel
                     {
                         rated = u.firstName + " " + u.lastName,
                         rater = u2.firstName + " " + u2.lastName,
                         score = c.score,
                         category_name = cat.name,
                         categoryid = c.category_id,

                     }
                     by new { rated = u.firstName + " " + u.lastName,rater = u2.firstName + " " + u2.lastName }).ToList();
这导致

  { rated = John Will, rater = Jess James}
   10 [Math]
   10 [Science]

  { rated = John Will, rater = Mike Rand}
   7 [Math]
   7 [Science]
我想让它看起来像

 { rated = John Will }
     rater:        Math      Science
     Jess James     10         10
     Mike Rand      7          7

 { rated = Jess James }
     rater:        Math      Science
     John Will      9          9
     Mike Rand      7          7
这是我的看法

     <table>
@foreach (var group in Model)
{
 <tr>
 <td>@group.Key </td>
 </tr>
    foreach (var m in group)
    {

      <tr>
      <td>@m.score - [@m.category_name]</td>
 </tr>

     }
}

</table>
如果可能的话,我希望这样做

 { rated = John Will }
     rater:        Math      Science
     Jess James     10         10
     Mike Rand      7          7

如果设置关联属性而不是使用联接,那么编写LINQ要容易得多。我想你想要的是这样的:

var results = (
    from a in db.Assessments
    from cs in a.CategoryScores
    select new RatingModel {
        ratedName = a.RatedUser.firstName + " " + a.RatedUser.lastName,
        raterName = a.RaterUser.firstName + " " + b.RaterUser.lastName,
        categoryName = cs.Category.name,
        cs.score,
        cs.category_id,
    })
    // bring into memory. It may work fine without this, but sometimes LINQ will perform multiple queries if you try to read in a queryable of groupings
    .AsEnumerable()
    .GroupBy(t => t.ratedName)
    .ToList();
要在视图中显示,请执行以下操作:

<table>
    @foreach (var group in Model)
    {
        var allCategories = group.Select(g => g.categoryName).Distinct().OrderBy(s => s).ToList();
        <tr>
            <td>rater: </td>
            @foreach (var name in allCategories) { <td>@name</td> }
        </tr>
        <tr>
            <td>@group.Key </td>
        </tr>
            foreach (var groupByRater in group.GroupBy(g => g.raterName))
            {
                <tr>
                <td>@groupByRater.Key </td>
                @foreach (var name in allCategories)
                {
                    var rating = groupByRater.FirstOrDefault(r => r.categoryName == name);
                        <td>@(rating == null ? string.Empty : rating.score)</td>
                }
            </tr>
            }
    }
</table>

@foreach(模型中的var组)
{
var allCategories=group.Select(g=>g.categoryName).Distinct().OrderBy(s=>s.ToList();
评分员:
@foreach(所有类别中的变量名){@name}
@组键
foreach(var groupByRater in group.GroupBy(g=>g.raterName))
{
@分组密码
@foreach(所有类别中的变量名称)
{
var rating=groupByRater.FirstOrDefault(r=>r.categoryName==name);
@(rating==null?string.Empty:rating.score)
}
}
}
尝试对每个分组调用
GroupBy()

var query = (from a in db.Assessments
             join u in db.Users on a.rated equals u.user_id
             join u2 in db.Users on a.rater equals u2.user_id
             join tm in db.Team_Members on u.user_id equals tm.user_id
             join t in db.Teams on tm.team_id equals t.team_id
             join c in db.Category_Scores on a.assessment_id equals c.assessment_id
             join cat in db.Categories on c.category_id equals cat.category_id

             group new KyubiViewModel
             {
                 rater = u2.firstName + " " + u2.lastName,
                 score = c.score,
                 category_name = cat.name,
                 categoryid = c.category_id
             }
             by new { rated = u.firstName + " " + u.lastName }
             into rated
             select new { Rated = rated.Key, Raters = rated.GroupBy(x => x.rater) }
             ).ToList();

感谢您的回复,我尝试在视图中显示它,但在生成结果时遇到困难,我应该如何在视图中执行循环?@shinratensei:假设您的模型是IEnumerable类型,如果属性名称发生一些更改,您当前的视图代码应该可以正常工作。您遇到了什么错误?我的错误,先生,我忘记在“选择新”之后添加我的viewmodel。这将根据我想要的评分对评分者进行分组,但在视图中显示正确的数据位置时遇到问题。我将编辑我的帖子,向您展示我当前拥有的视图。我得到了一个示例,传入字典的模型项是“System.Collections.Generic.List
1[f_uAnonymousTypea
2[f_uAnonymousType9
1[System.String],System.Collections.Generic.IEnumerable
1[System.Linq.IGrouping
2[System.String,Ca.ViewModel.KyubiViewModel]]”,但此词典需要“System.Collections.Generic.IEnumerable”类型的模型项
1[System.Linq.IGrouping`2[System.Object,Ca.ViewModel.KyubiViewModel]]”我在@model中使用此类型IEnumerable@shinratensei当前位置我猜您需要更改字典的类型。否则,您将如何更改数据的显示方式?
var query = (from a in db.Assessments
             join u in db.Users on a.rated equals u.user_id
             join u2 in db.Users on a.rater equals u2.user_id
             join tm in db.Team_Members on u.user_id equals tm.user_id
             join t in db.Teams on tm.team_id equals t.team_id
             join c in db.Category_Scores on a.assessment_id equals c.assessment_id
             join cat in db.Categories on c.category_id equals cat.category_id

             group new KyubiViewModel
             {
                 rater = u2.firstName + " " + u2.lastName,
                 score = c.score,
                 category_name = cat.name,
                 categoryid = c.category_id
             }
             by new { rated = u.firstName + " " + u.lastName }
             into rated
             select new { Rated = rated.Key, Raters = rated.GroupBy(x => x.rater) }
             ).ToList();