Linq选择distinct,然后按不同的属性排序
本文关键字:属性 排序 选择 distinct 然后 Linq | 更新日期: 2023-09-27 18:05:06
我有一个包含许多属性的表,但我专注于这些。每个问题都有一组答案,我需要把每个答案画出来。第一步是选择问题,然后返回答案列表。我需要选择每个不同的问题,并按QOrder排序。
<table>
<tr>
<td>Question</td>
<td>ProjectId</td>
<td>QOrder</td>
</tr>
<tr>
<td>Q10. What is your favourite color?</td>
<td>10</td>
<td>1</td>
</tr>
<tr>
<td>Q10. What is your favourite color?</td>
<td>10</td>
<td>2</td>
</tr>
<tr>
<td>Q10. What is your favourite color?</td>
<td>10</td>
<td>3</td>
</tr>
<tr>
<td>Q31. What is your favourite song?</td>
<td>10</td>
<td>4</td>
</tr>
<tr>
<td>Q31. What is your favourite song?</td>
<td>10</td>
<td>5</td>
</tr>
<tr>
<td>Q31. What is your favourite song?</td>
<td>10</td>
<td>6</td>
</tr>
</table>
using (var context = new ApplicationDbContext())
{
var x = context.Tables
.Where(t => t.ProjectId == projectId)
.Select(t => new TableViewModel()
{
Question = t.Question,
ProjectId = t.ProjectId,
QOrder = t.QOrder
})
.Distinct()
.OrderBy(t => t.QOrder)
.ToList();
return x;
}
不区分是因为QOrder不区分。如果我从视图模型中删除QOrder,我将无法按QOrder进行订购。
这可能吗?
解决方案:
using (var context = new ApplicationDbContext())
{
return context.Tables
.Where(t => t.ProjectId == projectId)
.Select(t => new TableViewModel()
{
Question = t.Question,
ProjectId = t.ProjectId,
QOrder = t.QOrder
})
.ToArray()
.Distinct(new TableViewModelComparer())
.OrderBy(t => t.QOrder)
.ToList();
}
public class TableViewModelComparer : IEqualityComparer<TableViewModel>
{
public bool Equals(TableViewModel x, TableViewModel y)
{
return x.Question == y.Question;
}
public int GetHashCode(TableViewModel obj)
{
if (object.ReferenceEquals(obj, null)) return 0;
return obj.Question == null ? 0 : obj.Question.GetHashCode();
}
}
我认为您没有正确使用Distinct函数。我想你应该使用函数的重载和这里的comparerenter链接描述
public class TableViewModelComparer : IEqualityComparer<TableViewModel>
{
public bool Equals(TableViewModel x, TableViewModel y)
{
return x.QOrder == y.QOrder;
}
public int GetHashCode(TableViewModelobj)
{
return obj.QOrder.GetHashCode();
}
}
,然后传递给不同的函数
var x = context.Tables
.Where(t => t.ProjectId == projectId)
.Select(t => new TableViewModel()
{
Question = t.Question,
ProjectId = t.ProjectId,
QOrder = t.QOrder
})
.Distinct(comparer: new TableViewModelComparer ())
.OrderBy(t => t.QOrder)
.ToList();
return x;