C#按多个值排序



我需要对多个值的列表进行排序。数据来自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是一个动态值:它是我的应用程序中当前经过身份验证的用户。我无法从任何地方访问此值。OwnerId值类型在实际情况下是GUID。

我尝试过,但没有成功:c#如何按值列1 对排序列表进行排序

C#列表<gt;按x排序,然后按y2 排序

我希望我的问题足够可以理解。请随时询问更多细节。提前谢谢。

编辑:

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

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

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

你需要使用MongoDB客户端在C#中翻译这个查询吗?

尝试这个查询,它可能会帮助您获得所需的结果:-

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

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

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

有关如何以各种方式使用它的更多想法,请参阅排序示例。请参阅与您的要求类似的最后一个示例。

希望这对你有帮助。

注意:-如果有很多记录,也可以在查询中使用.limit()。参见文档

我复制了您的数据集,但您的预测排序结果有点偏离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扩展之一,请注意,您可以在查询语法中做到这一点,但我只是选择使用方法语法。

多重排序示例

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

相关内容

  • 没有找到相关文章

最新更新