2014-10-06 2 views
1

Привет начал использовать MongoDB с C#, находя это действительно круто, просто интересно, что лучший способ для запросаMongoDB лучший способ запроса

SEEM, чтобы иметь возможность из следующих параметров

var query = Query<Entity>.EQ(e => e.Id, id); 
    var entity = collection.FindOne(query); 

против

var entity = collection.Entity.AsQueryable().Single(x => x.Id == id) 

Теперь второй выглядит более привлекательным для меня, как его то, к чему я привык, но с точки зрения производительности и лучшей практики, какая разница и что рекомендуется?

+0

У меня нет четкого ответа, но вы пробовали окружить его кодом System.Diagnostics.Stopwatch и делать запрос, скажем, тысячу раз?Должно дать вам дополнительную информацию. –

+0

Учитывая, что это операция с базой данных, время обратной связи с базой данных и обратно, вероятно, затмит любые оптимизации, которые вы выполняете в своем коде. – Philipp

+0

Должен дать эту попытку сегодня вечером, плохо опубликуйте результаты в этой теме – Luke

ответ

1

Ваш первый пример использует драйверы нативный запрос - По существу создание QueryDocument через Query<T> хелперов и т.д ..

Ваш второй использует Linq.

Под капотом, они обе сводятся к генерации один и тот же запрос:

db.entity.find({_id: 'abc123'}); 

Полученный QueryDocument сериализуется в качестве запроса, в данном случае

{_id: 'abc123'} 

Согласно linq docs:

Запросы LINQ, которые могут быть переведены в эквивалентный запрос MongoDB, поддерживаются д. Если вы пишете запрос LINQ, который не может быть переведен, вы получите исключение во время выполнения, и сообщение об ошибке укажет, какая часть запроса не была поддержана.

Для меня это было бы предположить, что есть некоторые накладные расходы преобразование LINQ запросов в запросы MongoDB ...

Я не проверял, но я подозреваю, используя запрос немного более производительный

1

Первого подход, в котором вы строите запрос, а затем используете его для поиска результата, фактически является Specification Pattern.

Второй подход, являющийся прямым запросом LINQ, обычно более известен разработчикам .NET.

Шаблон спецификации предоставляет вам многоразовый фрагмент логики фильтрации. Это очень полезно, если вам часто приходится фильтровать коллекции по тем же критериям - и особенно если фильтр необходимо применять к коллекциям из разных репозиториев.

Вот краткий пример возможного Useage его (простите любой грубый код, я был из C# на некоторое время теперь):

static class WidgetSpecification { 
    function Query<Widget> AvailableWidgets() 
    { 
     return new Query<Widget>.EQ(e => 
      e.StartDate <= Date.Today 
      && e.EndDate >= Date.Today 
      && e.Active == true 
      && e.InStock == true); 
    } 
} 

Тогда, в любом месте в вашем приложении, что вам нужно " доступные виджеты»вы назвали бы что-то вроде:

{ 
    ... 
    var products = getProductsFromSomewhere(); 
    var query = WidgetSpecifiation.AvailableWidgets(); 

    var availableProducts = Products.Find(query); 
    ... 
} 

Если вы когда-либо пересмотреть, что такое„доступен виджет“, что вы можете обновить спецификации и иметь все потребители ведут себя так же.

Смежные вопросы