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