RavenDB 按枚举排序

本文关键字:排序 枚举 RavenDB | 更新日期: 2023-09-27 18:33:36

在向RavenDB查询时是否可以按枚举进行排序或排序?也许通过给出一个可比的IComable?

我已经尝试过了,但似乎它的顺序就好像枚举是一个字符串一样,并且将枚举存储为整数对我来说不起作用。

下面是一个简单的示例:

public class Car
{
    public long Id { get; set; }
    public int NumberOfDoors { get; set; }   
    public int MaxSpeed { get; set; }   
    public Classification Classification { get; set; }   
}
public enum Classification 
{
    Compact, 
    Hatch,
    Convertible,
    Muscle
}

我想按以下顺序按分类排序:肌肉、紧凑、舱口、敞篷车。而且我想避免重新排列枚举并将枚举存储为整数。

我已经试过了,但它似乎不起作用:

//My query
var cars = session.Query<Car>()
                    .OrderBy(c => c.Classification , new ClassificationComparer())
                    .Skip(offset)
                    .Take(size);

public class ClassificationComparer: IComparer<Classification>
{
    public int Compare(Classification x, Classification y)
    {
        return Order(x).CompareTo(Order(y));
    }
    private int Order(Classification classification)
    {
        switch (classification)
        {
            case Classification.Compact:
                return 0;
            case Classification.Hatch:
                return 1;
            case Classification.Convertible:
                return 2;
            case Classification.Muscle:
                return 3;
            default:
                return int.MaxValue;
        }
    }
}

任何帮助,不胜感激。

RavenDB 按枚举排序

您可能

希望使用此答案中提出的解决方案,该解决方案显示了如何使用枚举的底层int值在RavenDB中持久化枚举。

但是,如果要将 Classification 属性保留为字符串并按int值对查询结果进行排序,一种可能的解决方案是:

创建一个索引,映射现有汽车并投放相应的ClassificationId

public class SortableCarIndex : AbstractIndexCreationTask<Car, SortableCar>
{
    public SortableCarIndex()
    {
        Map = cars =>
                from car in cars
                select
                    new SortableCar
                        {
                            Car = car,
                            ClassificationId =
                                Array.IndexOf(new[]{
                                    "Compact",
                                    "Hatch",
                                    "Convertible",
                                    "Muscle"
                                }, car.Classification)
                        };
    }
}
public class SortableCar
{
    public Car Car { get; set; }
    public int ClassificationId { get; set; }
}

确保索引存在于数据库中,在创建DocumentStore后使用以下代码行:

IndexCreation.CreateIndexes(typeof(SortableCarIndex).Assembly, documentStore);

创建索引后,可以像这样查询:

    var carsOrderedByClassification =
        session.Query<SortableCar, SortableCarIndex>()
                .OrderBy(x => x.ClassificationId)
                .AsProjection<Car>()
                .ToList();