Multimapping в Dapper без собственного SQL

Есть ли способ использовать multimapping в Dapper универсальным способом, без использования собственного SQL, встроенного в код C#?

Смотрите, например, Правильное использование Multimapping в Dapper.

Существует ли общий способ запроса данных от 2 связанных объектов, где общие поля определяются автоматически для объединения?

2 ответа

Решение

Не делай этого. Даже не думай так! Базы данных долговечны и нормализованы. Объекты являются скоропортящимися и часто денормализованными, и переход между ними должен быть продуманным, когда вы пишете SQL. Это действительно не шаг к автоматизации. Долгий, болезненный опыт убедил многих из нас, что абстракции базы данных (таблицы и объединения) не должны быть просто втянуты (или сгенерированы из) кода. Если вы еще не уверены, тогда используйте установленный ORM.

Если, с другой стороны, вы абсолютно хотите контролировать свой SQL, но это "встраивание" строковых литералов в C#, что вызывает ошибки, то я не могу согласиться с этим. Могу ли я предложить QueryFirst, визуальное студийное расширение, которое генерирует оболочку C# для ваших запросов. Ваш SQL остается в реальном файле SQL, проверяется синтаксис, проверяются ссылки на БД, и при каждом сохранении QueryFirst генерирует класс-оболочку с методами Execute() и POCO для результатов.

Я полагаю, что при многократном отображении вы хотите заполнить график вложенных объектов. Хороший способ сделать это - использовать один QueryFirst .sql для каждого класса в вашем графике, а затем в частичном классе родительского элемента добавить List детей. (Сгенерированные QueryFirst POCO разделены на 2 частичных класса, вы управляете одним из них, инструмент генерирует другой.)

Итак, для графа клиентов и их заказов... в родительском sql

select * from customers where name like @custName

Детский sql

select * from orders where customerId = @customerId

В родительском частичном классе для быстрой загрузки...

    public List<Orders> orders;
    public void OnLoad()
    {
        orders = new getOrders().Execute(customerId); // property of the parent POCO
    }

или для ленивой загрузки...

    private List<Orders> _orders;
    public List<Orders> orders
    {
        get
        {                
            return _orders ?? _orders = new GetOrders().Execute(customerId);                
        }
    }

5 строк кода, не считая скобок, и у вас есть вложенный график, загруженный с отложенной загрузкой или загруженный по вашему усмотрению, интерфейс, обнаруживаемый в коде (intellisense для входного параметра и результата). Это могут быть сотни столбцов в этих таблицах, имена которых вам никогда не понадобятся для повторного ввода, а типы данных будут прозрачно перетекать в ваш C#.

Чистое разделение обязанностей. Тотальный контроль. Отказ от ответственности: я написал QueryFirst:-)

Multimapping with Dapper - это метод одновременного запуска нескольких SQL-запросов, а затем возврата каждого результата, сопоставленного конкретному объекту.

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

Я подозреваю, что вы ищете что-то похожее на Entity Framework. Есть пара проектов расширения Dapper, которые вы, возможно, захотите изучить, которые сгенерируют часть вашего SQL. Смотрите: Dapper.Rainbow VS Dapper.Contrib

Другие вопросы по тегам