Допустим, мне нужно получить все предметы
где парентида равна 1.
Во-первых, перестаньте думать о ваших потребностях в доступе к данным таким образом.
Вы НЕ должны " получить все предметы, где парентида равна 1 ". Это поможет попытаться перестать мыслить таким ориентированным на данные способом.
Что вам нужно, это выбрать все предметы с определенным родителем. Это концепция, которая существует в вашем проблемном пространстве (домен вашего приложения).
Тот факт, что вы моделируете это в базе данных с помощью внешнего ключа и поля с именем parentid, является подробным описанием . Инкапсулируйте это, не пропускайте через приложение.
Одним из способов является использование IQueryable
List () и получить все документы, а затем
добавить предложение where для выбора элементов
где парентида равна 1. Это
кажется плохой идеей, потому что я не могу
использовать любые функции индекса в RavenDB. Так
Другой подход заключается в том, чтобы иметь
как то так, IEnumerable
Найти (строковый индекс, предикат Func) в
хранилище, но это также кажется
как плохая идея, потому что
Обе эти идеи плохие. Вы предлагаете, чтобы код, вызывающий ваше хранилище или запрос, обладал знаниями о вашей схеме.
Почему потребитель вашего хранилища должен заботиться или знать, что есть поле для парентидного действия? Если это изменится, если изменится определение какой-то конкретной концепции в вашем проблемном пространстве, сколько мест в вашем коде придется изменить?
Каждое место, где выбираются предметы с определенным родителем.
Это плохо, это антитеза инкапсуляции.
Мое мнение таково, что вы захотите моделировать запросы как явные понятия, а не как лямбда или строки, передаваемые и используемые повсеместно.
Вы можете явно моделировать запросы с помощью шаблона Спецификации, именованных методов запросов в хранилище, шаблона Объекта запроса и т. Д.
это не так
достаточно общий и требует, чтобы я
реализовать этот метод, если бы я
перейти с RavenDB на общий sql
сервер.
Хорошо, что Func
слишком обобщенно. Опять же, подумайте, что нужно знать вашему потребляющему коду для того, чтобы использовать такой метод запросов, вы будете привязывать верхние уровни вашего кода непосредственно к вашей схеме БД, делая это.
Кроме того, если вы перейдете с одного механизма хранения на другой, вы не сможете избежать повторной реализации запросов, когда производительность была достаточным фактором для использования вспомогательных средств, специфичных для механизма хранения (например, индексы в Raven).