C# linq选择distinct,然后按不同属性排序

C# linq选择distinct,然后按不同属性排序,c#,linq-to-sql,entity-framework-6,C#,Linq To Sql,Entity Framework 6,我有一个包含许多属性的表,但我专注于这些属性。每个问题都有一组答案,我需要绘制每个答案的图表。第一步是选择哪个问题,然后返回答案列表。我需要选择每个不同的问题并按顺序排序 <table> <tr> <td>Question</td> <td>ProjectId</td> <td>QOrder</td> </tr>

我有一个包含许多属性的表,但我专注于这些属性。每个问题都有一组答案,我需要绘制每个答案的图表。第一步是选择哪个问题,然后返回答案列表。我需要选择每个不同的问题并按顺序排序

 <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;
}

问题:
投射
库德
问题10。你最喜欢什么颜色?
10
1.
问题10。你最喜欢什么颜色?
10
2.
问题10。你最喜欢什么颜色?
10
3.
问题31。你最喜欢的歌是什么?
10
4.
问题31。你最喜欢的歌是什么?
10
5.
问题31。你最喜欢的歌是什么?
10
6.
使用(var context=new ApplicationDbContext())
{
var x=context.Tables
.其中(t=>t.ProjectId==ProjectId)
.Select(t=>newtableviewmodel()
{
问题,
projectd=t.projectd,
QOrder=t.QOrder
})
.Distinct()
.OrderBy(t=>t.QOrder)
.ToList();
返回x;
}
因为QOrder不清楚,所以distinct不起作用。 如果我从viewmodel中删除QOrder,我将无法按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;
}
这可能吗

解决方案:

    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();
    }
}
使用(var context=new ApplicationDbContext())
{
返回context.Tables
.其中(t=>t.ProjectId==ProjectId)
.Select(t=>newtableviewmodel()
{
问题,
projectd=t.projectd,
QOrder=t.QOrder
})
.ToArray()
.Distinct(新的TableViewModelComparer())
.OrderBy(t=>t.QOrder)
.ToList();
}
公共类TableViewModelComparer:IEqualityComparer
{
公共布尔等于(TableViewModel x、TableViewModel y)
{
返回x.问题==y.问题;
}
public int GetHashCode(TableViewModel obj)
{
if(object.ReferenceEquals(obj,null))返回0;
返回obj.Question==null?0:obj.Question.GetHashCode();
}
}

我认为您没有正确使用Distinct函数。我想你应该用比较器的超负荷功能


那么-同一个问题有不同的顺序?对分组列表进行排序时,要使用哪个顺序?最大值?敏?平均值?您计划如何订购“Q10.您最喜欢的颜色是什么?| 10 | 1”、“Q10.您最喜欢的颜色是什么?| 10 | 3”和“Q31.您最喜欢的歌曲是什么?| 10 | 2”?如果Q顺序不明确,则只会删除重复值
   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;