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;
}
}
}
任何帮助,不胜感激。
您可能
希望使用此答案中提出的解决方案,该解决方案显示了如何使用枚举的底层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();