Запрос RavenDB с Linq и enum

Учитывая этот класс документа:

public class Tea
{
   public String Id { get; set; }

   public String Name { get; set; }

   public TeaType Type { get; set; }

   public Double WaterTemp { get; set; }

   public Int32 SleepTime { get; set; }
}

public enum TeaType
{
    Black,
    Green,
    Yellow,
    Oolong
}

Я храню новый чай со следующим кодом:

using (var ds = new DocumentStore { Url = "http://localhost:8080/" }.Initialize())
using (var session = ds.OpenSession("RavenDBFirstSteps"))
{
    Tea tea = new Tea() { Name = "Earl Grey", Type = TeaType.Black, WaterTemp = 99d, SleepTime = 3 };
    session.Store(tea);
    session.SaveChanges();
    Console.WriteLine(tea.Id);
}

Чай будет успешно сохранен, но когда я пытаюсь запросить все черные чаи с помощью linq, я не получаю никаких результатов:

using (var ds = new DocumentStore { Url = "http://localhost:8080/" }.Initialize())
using (var session = ds.OpenSession("RavenDBFirstSteps"))
{
    var dbTeas = from teas in session.Query<Tea>()
                    where teas.Type == TeaType.Black
                    select teas;

    foreach (var dbTea in dbTeas)
    {
        Console.WriteLine(dbTea.Id + ": " + dbTea.Name);
    }
}

Я также попытался сохранить Enum как Integer с помощью следующей команды:

ds.Conventions.SaveEnumsAsIntegers = true;

Но результат тот же. Все работает, когда я использую Name или WaterTemp. Поддерживает ли RavenDB Enums таким образом, или я совершенно не прав?


person Kai    schedule 02.03.2013    source источник
comment
Разве TeaType не должен быть целым числом?   -  person Colin Pear    schedule 02.03.2013
comment
@ColinPear С точки зрения C# перечисление TeaType внутренне является целым числом.   -  person Kai    schedule 02.03.2013
comment
Я понимаю. Меня постоянно смущает название этого реквизита   -  person Colin Pear    schedule 02.03.2013
comment
@ColinPear спасибо за ответ. Это не было решением, но я начал думать о названии реквизита :-)   -  person Kai    schedule 02.03.2013
comment
Я считаю, что вы все еще можете использовать Type, если хотите. Вы можете сделать public TeaType @Type {get; set;}   -  person Colin Pear    schedule 02.03.2013
comment
@ColinPear Вы правы, но я не фанат дословного оператора, когда речь идет о зарезервированных ключевых словах. Я рекомендую использовать другое имя вместо ключевого слова.   -  person Kai    schedule 02.03.2013
comment
@Kai, с точки зрения Ворона, все в json. По умолчанию перечисления сериализуются как строки.   -  person Matt Johnson-Pint    schedule 02.03.2013


Ответы (1)


Кажется, я получил ответ. Всегда не рекомендуется использовать свойства с именем типа Type, которое может быть зарезервированным ключевым словом.

Я переименовал Type и все работает, так что ответ такой:

public class Tea
{
   public String Id { get; set; }

   public String Name { get; set; }

   public TeaType TeaType { get; set; }

   public Double WaterTemp { get; set; }

   public Int32 SleepTime { get; set; }
}
person Kai    schedule 02.03.2013
comment
@MattJohnson, извините, я скопировал неправильный код. Вот это правильно. - person Kai; 02.03.2013