Asp.net mvc linq嵌套分组方式
我有一个评估表,其中包含{rated,rater,Assessment_id}另一个表是Category_Scores,其中包含{score,Assessment_id}。我正试图按评分员分组,按分数分组。目前我有这个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
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_uAnonymousType91[System.String],System.Collections.Generic.IEnumerable
1[System.Linq.IGrouping2[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();