Возможна ли ленивая загрузка в dapper? И в чем разница между общим (POCO) и динамическим API?

У меня есть два вопроса о работе с dapper:

  • Есть ли способ загрузить свойство навигационного ключа, например entity-framework (lazy-load)?

  • Какая разница между POCO serialization и dynamic serialization? что лучше? и как я могу использовать эту сериализацию?

Ответ 1

Есть ли способ загрузить свойство навигационного ключа, например entity-framework (lazy-loading)?

Нет, Dapper - это библиотека прямого SQL, и почему это так смешно быстро. На автоматическую загрузку нет накладных расходов. Однако вы можете загружать сразу несколько объектов.

какая разница между сериализацией POCO и динамической сериализацией? что лучше? и как я могу использовать эту сериализацию?

Сериализация POCO более эффективна, поскольку тип хорошо известен во время компиляции, динамическая сериализация немного дороже, потому что ее нужно оценивать во время выполнения. Кроме этого, на самом деле нет разницы.

Однако я бы рекомендовал Dapper над всеми другими библиотеками где угодно. Это просто, быстро и чрезвычайно гибко. И поверьте мне, я использовал множество фреймворков и библиотек для доступа к данным.

Документация Dapper

Посмотрите Multi Mapping и Несколько результатов

Ответ 2

1: нет; ни одного, если вы не откажетесь от него полностью. Он преднамеренно минималистичен и детерминирован.

2: материализация в POCO удобна, если вы хотите разоблачить эти данные в других частях вашего приложения, например, в качестве данных для модели представления; Query<Customer>, например, может заполнять известные объекты Customer, которые вы можете кодировать в других местах. dynamic очень удобен, но не очень изучен - и не будет хорошо работать для привязки данных или intellisense. Тем не менее, это действительно полезно для DAL-методов, которые остаются очень локальными или примером

var row = conn.Query("select qty, cost from parts where id = @id",
    new { id }).Single();
int qty = row.qty;
decimal cost = row.cost;
// and off we go...

или

var lookup = conn.Query("select id, name from somelookup").ToDictionary(
      x => (int)x.id, x => (string)x.name);

Ответ 3

Насколько я знаю, нет никакой ленивой поддержки загрузки в dapper, если вы не обработаете что-то, используя класс Lazy<T> в .NET.

Сегментация POCO - это то, где вы определяете класс, и экземпляры этого используются для добавления/редактирования/чтения строк из таблицы.

Динамическая сериализация - это использование объектов dynamic в .NET(где вы не определяете классы).

Динамика будет быстрее идти, хотя у вас не будет никаких проблем с интеллектом или типом. POCOs займут немного больше времени, чтобы получить настройку (поскольку вам нужно создать каждый класс, который вы хотите использовать), но вы сохраните тип безопасности и intelisense.