Я пытаюсь заменить неприятное обращение LINQ 2 SQL некоторыми умными запросами, чтобы улучшить производительность. При этом я должен сплести кучу разных объектов вместе, чтобы создать большой объект, необходимый для хранения всей информации, необходимой мне для информации ASN.
Текущая проблема, с которой я столкнулся, связана с абстрактным классом Orders. Этот класс реализован двумя отдельными классами AutionOrder и MerchantOrder с использованием свойства дискриминатора.
Поскольку я не могу использовать dapper для создания объекта, который является абстрактным классом, я вместо этого использую один из общедоступных классов.однако, когда он идет на построение объекта, он терпит неудачу внутри GetSettableProps
, он находит правильный DeclaringType
, но метод GetProperty
возвращает null, когда ищет свойство, которое является внутренним
или EntitySet
. Я пытался обойти это, используя t.BaseType.GetProperty
, а также p.GetAccessors (). First (). GetBaseDefinition (). DeclaringType.GetProperty (p.Name) .GetSetMethod (правда)
безуспешно.
фиктивные объекты:
Заказ
OrderID, Name, Address, RowVersion (internal), Shipments (EntitySet), OrderDetails (EntitySet), Customer (EntityRef)
Shipment
ShipmentID, OrderID, TrackingNumber
OrderDetails
OrderDetailID, OrderID, Product, QTY, Price
Customer
CustomerID, Name,
Для этого конкретного запроса SQL я пытаюсь получить некоторые из необходимых мне сопоставлений отношений 1 к 1 .
SELECT o. * From Orders as o left Присоединиться к клиентам как c on 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, но из-за этой проблемы у меня разбегается голова - спасибо за помощь!