【问题标题】:linq select distinct then order by a different propertylinq select distinct 然后按不同的属性排序
【发布时间】:2015-07-28 16:19:35
【问题描述】:

我有一个包含许多属性的表,但我专注于这些。每个问题都有一组答案,我需要绘制每个答案的图表。第一步是选择哪个问题,然后我返回一个答案列表。我需要选择每个不同的问题并按 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();
    }
}

【问题讨论】:

  • 那么 - 同一个问题有不同的顺序?在对分组列表进行排序时,您希望使用 哪个 顺序?最大限度?敏?平均?
  • 您打算如何订购“Q10。你最喜欢的颜色是什么?|10|1”、“Q10。你最喜欢的颜色是什么?|10|3”和“Q31。什么是你最喜欢的歌?|10|2"?
  • 如果 Q 顺序不明显,它只会切断重复值

标签: c# linq-to-sql entity-framework-6


【解决方案1】:

我认为您没有正确使用 Distinct 功能。我认为您想将函数的重载与 comparerenter 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();
           }
       }

然后将其传递给 distinct 函数

   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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    相关资源
    最近更新 更多