Должен ли я использовать LINQ-запросы на RavenDB? - PullRequest
5 голосов
/ 06 декабря 2011

Я изучаю RavenDB, и я в замешательстве. Насколько я понимаю, нужно создавать индексы, чтобы иметь действительно эффективные запросы. Тем не менее, можно просто выполнять запросы LINQ, например

using(IDocumentSession session = _store.OpenSession())
{
    MyDocument doc = session.Query<MyDocument>()
                            .Where(d => d.Property == value)
                            .Single();
}

Этот тип запроса работает отлично. Однако я никогда не создавал для него индекс (и, конечно, никогда не ссылался на индекс при выполнении запроса).

Должен ли я использовать этот тип запроса при работе с RavenDB? Если нет, то почему он вообще доступен в API?

Ответы [ 3 ]

8 голосов
/ 06 декабря 2011

Здесь есть две вещи, которые вы спрашиваете.

  1. Можем ли мы использовать индексы, которые должны быть более эффективными, чем динамические запросы?
  2. Если мы используем индексы .. тогда мы должны использовать Linq и цепочку?

Индексы

Как правильно сказал Мэтт Уоррен, вы не используете индексы в своем примере запроса. Прямо сейчас, с вашим примером запроса, RavenDb достаточно умен, чтобы создать временный (динамический) индекс. Если этот динамический индекс используется достаточно, он автоматически переводится в статический / постоянный индекс.

Итак ... вы должны использовать индексы? Если можешь, то да!

вот ваше утверждение снова, на этот раз с определенным индексом.

using(IDocumentSession session = _store.OpenSession())
{
    MyDocument doc = session.Query<MyDocument>("ByProperty")
                            .Where(d => d.Property == value)
                            .Single();
}

В этом случае где-то был создан индекс с именем MyDocument_ByProperty. Я не собираюсь объяснять детали индексов .. иди и прочитайте все о них здесь .

Линк и цепочка

(Не уверен, что это правильная терминология ...)

Если вы создаете оператор linq (который я делал выше) с OR без индекса .. запрос все еще генерируется .. который затем транслируется в HTTP-запрос RESTful к серверу RavenDB. Если у вас есть индекс ... тогда запрос достаточно умен, чтобы попросить его использовать. Никто? Затем сервер создаст динамический индекс. Это означает, что ему также придется сначала пройти процедуру индексации, а затем получить ваши результаты.

TL; DR;

Да, используйте индексы. Да, используйте цепочку Linq.

5 голосов
/ 06 декабря 2011

RavenDb поставляется с встроенной поддержкой .Net и Linq.

Поставщик Linq изнутри выполняет обычные вызовы REST к серверу ravendb, но для вас проще на нем кодировать, так как вы можетеиспользуйте IQueryable<T> со строго типизированными классами.

Так что да, вы можете и должны использовать linq / lambda для работы с RavenDB в среде .Net.

1 голос
/ 16 февраля 2015

Что следует знать о том, что меня поймало, это то, что если вы включите оператор linq, например .Where (d => d.SomeProperty == null), то вы можете ожидать, что если документ не имеет свойства, то вы вернет матч. Однако, это не так. Если документ не имеет свойства, его значение не считается нулевым (или любым другим значением).

...