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

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

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

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

3 ответов


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

нет, Dapper-это библиотека прямого SQL, и именно поэтому она так смехотворно быстра. Вокруг автоматизированной загрузки нет накладных расходов. Однако можно загрузить несколько сущностей одновременно.

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

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

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

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

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


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

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

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);

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

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

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

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