linq select distinct 然后按不同的 属性 排序
linq select distinct then order by a different property
我有一个 table,其中包含许多属性,但我主要关注这些。每个问题都有一组答案,我需要绘制每个答案的图表。第一步是select哪个问题然后我return一个答案列表。我需要 select 每个不同的问题并按 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;
}
distinct 不起作用,因为 QOrder 不是 distinct。
如果我从我的视图模型中删除 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 函数。我认为您想将函数的重载与比较器enter link description here
一起使用
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;
我有一个 table,其中包含许多属性,但我主要关注这些。每个问题都有一组答案,我需要绘制每个答案的图表。第一步是select哪个问题然后我return一个答案列表。我需要 select 每个不同的问题并按 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;
}
distinct 不起作用,因为 QOrder 不是 distinct。 如果我从我的视图模型中删除 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 函数。我认为您想将函数的重载与比较器enter link description here
一起使用 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;