Я пытаюсь заменить неприятный запрос LINQ 2 SQL некоторыми запросами dapper, чтобы улучшить производительность. При этом я должен сплести кучу разных объектов вместе, чтобы создать большой объект, необходимый для хранения всей информации, необходимой мне для информации ASN.
Текущая проблема, с которой я столкнулся, связана с абстрактным классом Orders, этот класс реализован двумя отдельными классами AutionOrder и MerchantOrder с использованием свойства дискриминатора.
Поскольку я не могу использовать dapper для создания объекта, который является абстрактным классом, я вместо этого использую один из общедоступных классов. однако, когда он идет на построение объекта, он терпит неудачу внутри GetSettableProps
, он находит правильный DeclaringType
, но метод GetProperty
возвращает null, когда ищет свойство, равное internal
или EntitySet
. Я безуспешно пытался обойти это с помощью t.BaseType.GetProperty
, а также p.GetAccessors().First().GetBaseDefinition().DeclaringType.GetProperty(p.Name).GetSetMethod(true)
.
фиктивные объекты:
порядок
OrderID, имя, адрес, RowVersion (внутренний), отгрузки (EntitySet), OrderDetails (EntitySet), Customer (EntityRef)
Отгрузка
ShipmentID, OrderID, TrackingNumber
Информация для заказа
OrderDetailID, OrderID, Product, QTY, Price
Покупатель
CustomerID, имя,
Для этого конкретного запроса SQL я пытаюсь получить некоторые нужные мне сопоставления отношений 1 к 1.
ВЫБЕРИТЕ o. * Из заказов как o осталось, присоединитесь к клиентам как c o.CustomerID = c.CustomerID, где o.OrderID в (1,2,3);
Вот что я использую, чтобы использовать dapper и позволить ему творить чудеса:
using (var connection = new SqlConnection(_ConnectionString))
{
connection.Open();
results = connection.Query<MerchantOrder, MerchantCustomer, MerchantOrder>(sql.ToString(),
(o, c) => { o.Customer = c; return o; },
splitOn: "CustomerID");
}
Если я изменю Order на публичный класс, эта проблема исчезнет, но это нежелательный побочный эффект. Ошибка при попытке установить propInfo для RowVersion - переключение на общедоступное вместо внутреннего решило эту проблему, хотя и нежелательно. Но затем он терпит неудачу, когда пытается создать объекты отгрузки для заказа. Опять же, все это не является проблемой, когда Order является общедоступным классом.
Кроме того, я делаю отдельные запросы, чтобы вывести отношения «многие к одному», такие как «Отгрузки к заказам» и «Детали заказа» к заказам, и нормализовать результаты в соответствующий объект заказа. MerchantOrder - это практически пустой класс без особой логики. Отличительная особенность здесь заключается в том, как мы в конечном итоге находим CustomerID, который в любом случае абстрагируется до фактического обращения к SQL.
Также я использую последнюю версию dapper по состоянию на 20.12.2011.
Мне очень нравится dapper, но от этой проблемы у меня голова взрывается - спасибо за помощь!