我需要对多个值的列表进行排序。数据来自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();