2

RavenDB へのクエリを作成するときに、Enum を Sort または OrderBy することは可能ですか? 多分 IComparable を与えることによって?

試してみましたが、列挙型が文字列であるかのように注文するようで、列挙型を整数として格納することはできません。

簡単な例を次に示します。

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

どんな助けでも大歓迎です。

4

1 に答える 1

2

この回答で提案されているソリューションを使用することをお勧めします。これは、基になる値を使用して RavenDB で列挙型を保持する方法を示していintます。

ただし、Classificationプロパティを文字列として保持し、クエリの結果をint値で並べ替える場合、考えられる解決策の 1 つは次のとおりです。

既存の車と広告を対応する にマップするインデックスを作成します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 に答える