【问题标题】:C# Sort by multiple valueC# 按多个值排序
【发布时间】:2016-07-22 08:45:43
【问题描述】:

我需要根据多个值对列表进行排序。数据来自 MongoDb 数据库,我从 C# 加载它。

示例

Unsorted            
OwnerId     Status      Date
123         New         2016-01-01
456         New         2016-01-01
789         New         2016-01-06
123         New         2016-01-05
456         Qualified   2016-01-05
789         Converted   2016-01-01
123         Qualified   2016-01-02

Expected
OwnerId     Status      Date
123         New         2016-01-05
123         New         2016-01-01
123         Qualified   2016-01-02
789         New         2016-01-06
456         New         2016-01-01
456         Qualified   2016-01-05
789         Converted   2016-01-01

我需要先显示 OwnerId 456,然后是 New 状态,然后是日期降序。

OwnerId 是一个 dynamic 值:它是我当前在我的应用中经过身份验证的用户。我无法从任何地方访问此值。 OwnerId 值类型是实际情况下的 GUID。

我尝试这个没有成功: c# How to sort a sorted list by its value column1

C# List<> Sort by x then y2

我希望我的问题是可以理解的。不要犹豫,询问更多细节。 提前致谢。

编辑:

我无法直接用 mongo 实现这一点。我需要一个 C# 解决方案。

【问题讨论】:

  • 您想要 mongo 查询的答案吗?正如你在我问的问题中标记了mongodb。此外,您提供链接的问题与 mongo 查询无关。
  • 使用 Mongo 或 C#
  • 使用 mongodb` 一个查询可以帮助您,但它也会在 ownerId - 456 and 789 上应用相同的排序`。这样得到结果可以吗?
  • @Karine 我在想最简单的方法是两个不同的查询?我目前无法在 C# 中想出一种更简洁的方式来执行您想要的操作,因此您最终可能会通过两个查询做得更好,即您似乎不想只按“所有者 ID-> 新建-> 日期描述”进行排序,您想做“所有者 ID 456 -> 新建 -> 日期描述”+“所有者 ID !456 -> !456 新建 -> !456 日期描述”。如果没有人有其他答案,请考虑两个查询并删除交叉点

标签: c# linq list sorting


【解决方案1】:

您可以使用此查询进行排序:

db.<people>.sort( { OwnerId : 0, Date : 1 })

您需要使用 MongoDB 客户端在 C# 中翻译此查询吗?

【讨论】:

  • 此查询不足以在问题中提供所需的输出。回答前请阅读并理解问题。
  • 哈哈。也许在这里您可以找到解决方案stackoverflow.com/questions/2123529/…
  • 它也会对status 字段进行排序吗?我认为这就是您的查询中缺少的内容。
  • 是的,我需要用 C# 翻译它。我使用 MongoDb C# 驱动程序
【解决方案2】:

试试这个查询,它可能会帮助你得到你想要的结果:-

db.collName.find({findQuery}).sort({ 'OwnerId' : 1, 'Status':1, 'Date' : -1 })

查询将首先按升序对OwnerId 的记录进行排序。然后它将根据 status 的值进行排序,最后它将按降序对 Date 字段进行排序。

现在你应该通过所有的排序得到你想要的结果

请参阅sort-example,了解有关如何以各种方式使用它的更多信息。请参阅与您的要求相似的最后一个示例。

希望这会对你有所帮助。

注意:- 如果有很多记录,请在查询中也使用 .limit()。见doc

【讨论】:

  • 我不想升序排序。我想根据值进行排序。如果我当前的用户是 OwnerId 456,它将不起作用。状态将类似于“已转换,新,合格”,但我希望首先是“新”
  • 好的!然后mongo查询似乎无法帮助您。您只需手动操作即可。我无法帮助你,因为我不知道 C#
  • 好的,谢谢领导。我现在知道我无法用 mongo 实现这一目标
【解决方案3】:

我复制了您的数据集,但您预计的排序结果与 OwnerId 属性有点偏差。但是,在控制台应用程序(或您喜欢的任何模板)中运行此代码,如果这些是您正在寻找的结果,请告诉我:

public class GonnaSortThisData
{
    public GonnaSortThisData()
    {
        User currentUser = new User
        {
            UserId = 123,
            UserName = "UserMan"
        };

        List<Data> dataValues = new List<Data>
        {
            new Data {OwnerId = 123, Status = Status.New, Date = DateTime.Parse(@"2016-01-01")},
            new Data {OwnerId = 456, Status = Status.New, Date = DateTime.Parse(@"2016-01-01")},
            new Data {OwnerId = 789, Status = Status.New, Date = DateTime.Parse(@"2016-01-06")},
            new Data {OwnerId = 123, Status = Status.New, Date = DateTime.Parse(@"2016-01-05")},
            new Data {OwnerId = 456, Status = Status.Qualified, Date = DateTime.Parse(@"2016-01-05")},
            new Data {OwnerId = 789, Status = Status.Converted, Date = DateTime.Parse(@"2016-01-01")},
            new Data {OwnerId = 123, Status = Status.Qualified, Date = DateTime.Parse(@"2016-01-02")}
        };

        //var = List<Data>
        var sortedValues = dataValues
            .OrderByDescending(list => list.OwnerId == currentUser.UserId)
            .ThenBy(list => list.Status)
            .ThenByDescending(list => list.Date).ToList();
    }
}

public class User
{
    public int UserId { get; set; }
    public string UserName { get; set; }
}

public class Data
{
    public dynamic OwnerId { get; set; }
    public Status Status { get; set; }
    public DateTime Date { get; set; }
}

public enum Status
{
    New, Qualified, Converted
}

请忽略 Enum 和 Data 类,因为它们仅表示源自 MongoDB 数据库表的记录。动态属性将在运行时由 LINQ 动态解析。仔细查看对ThenBy() 的调用。这是我最喜欢的 LINQ 扩展之一,请注意您可以在查询语法中执行此操作,但我只是选择使用方法语法。

【讨论】:

  • 我需要根据动态值对我的 OwnerId 进行排序。可以是 456 或 123 或 789 先显示。您的解决方案将对 123,456,789 进行排序。这不是我所期望的
  • 很抱歉,我稍微误读了您的问题,我以为您的意思是 OwnerId 的类型实际上是动态的,而不是在运行时该值会发生变化。但是,我对此评论有疑问,“OwnerId 是一个动态值:它是我当前在我的应用程序中经过身份验证的用户。我无法从任何地方访问此值。OwnerId 值类型是实际情况下的 GUID。”如果我们无法访问该属性,我不确定您认为我们可以如何操纵我们的查询。我想在继续之前我们需要查看这些类型的域模型。
【解决方案4】:

多重排序示例

  return await Collection()
       .Find(_ => true)
       .Sort(Builders<SomeEntity>.Sort.Descending(x => x.SomeValueToSort1).Descending(x => x.SomeValueToSort2))
       .ToListAsync();

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    相关资源
    最近更新 更多