首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#按多值排序

C#按多值排序
EN

Stack Overflow用户
提问于 2016-07-22 08:45:43
回答 4查看 3.1K关注 0票数 0

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

示例

代码语言:javascript
运行
复制
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# List<> Sort by x then y2

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

编辑:

我不能直接用芒果来达到这个目的。我需要一个C#解决方案。

EN

回答 4

Stack Overflow用户

发布于 2016-07-22 09:28:37

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

代码语言:javascript
运行
复制
db.<people>.sort( { OwnerId : 0, Date : 1 })

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

票数 0
EN

Stack Overflow用户

发布于 2016-07-22 10:51:06

尝试这个查询,它可以帮助您获得您想要的结果:-

代码语言:javascript
运行
复制
db.collName.find({findQuery}).sort({ 'OwnerId' : 1, 'Status':1, 'Date' : -1 })

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

现在,您应该通过所有排序获得您想要的结果。

有关如何以各种方式使用它的更多信息,请参见排序-示例。请参见最后一个类似于您的需求的示例。

希望这能帮到你。

注意:-如果有很多记录,也可以在查询中使用.limit() 。见https://docs.mongodb.com/manual/reference/method/cursor.sort/#limit-results.

票数 0
EN

Stack Overflow用户

发布于 2016-07-23 05:15:07

我复制了您的数据集,但是您预计的排序结果有点偏离了OwnerId属性。但是,在控制台应用程序(或您喜欢的任何模板)中运行这段代码,并让我知道这些是否是您正在寻找的结果:

代码语言:javascript
运行
复制
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扩展之一,请注意,您有能力在查询语法中这样做,但我只是选择使用方法语法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38522019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档