RavenDB按枚举排序

时间:2013-10-03 06:18:44

标签: c# ravendb

在向RavenDB进行查询时,是否可以对Enum进行排序或订单?也许通过提供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;
        }
    }
}

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您可能希望使用this answer中提出的解决方案,该解决方案展示了如何使用基础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();