2

对 RavenDB 进行查询时,是否可以对枚举进行排序或排序?也许通过提供 IComparable?

我已经尝试过,但似乎它的命令好像 Enum 是一个字符串,并且它不适用于我将 Enums 存储为整数。

这是一个简单的例子:

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
}

我想按以下顺序按分类订购:Muscle、Compact、Hatch、Convertible。而且我想避免重新排列枚举并将枚举存储为整数。

我试过这个,但它似乎不起作用:

//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;
        }
    }
}

任何帮助表示赞赏。

4

1 回答 1

2

您可能希望使用此答案中提出的解决方案,该解决方案展示了如何使用它们的基础int值在 RavenDB 中持久化枚举。

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

创建一个索引来映射现有的 Cars 和相应的广告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();
于 2013-10-03T10:24:36.697 回答