У меня определены следующие объекты передачи данных:
Public Class MemberWithAddressesDTO
Public Property Member_PK As Integer
Public Property Firstname As String
Public Property DefaultAddress As AddressDTO
Public Property Addresses As IQueryable(Of AddressDTO)
End Class
Public Class AddressDTO
Public Property Address_PK As Integer
Public Property Address1 As String
Public Property Address2 As String
End Class
Я определил следующее выражение, которое сопоставляет мою сущность с моим DTO, чтобы я мог повторно использовать это в запросах (фактическое выражение генерируется T4шаблон):
Public Shared AsAddressDTO As Expression(Of Func(Of Address, AddressDTO)) =
Function(ent As Address) New AddressDTO With {.Address_PK = ent.Address_PK, _
.Address1 = ent.Address1,
.Address2 = ent.Address2}
Я могу использовать это выражение в запросе LINQ-to-Entities для преобразования списков объектов Address в список AddressDTO:
Using context As New DbContext
Dim mem As MemberWithAddressesDTO =
context.Members _
.Where(Function(m) m.Person_PK = 121) _
.Select(Function(m) New MemberWithAddressesDTO With {
.Member_PK = m.Person_PK, _
.Firstname = m.Firstname, _
.Addresses = ent.Addresses.AsQueryable.Select(AsAddressDTO)}
).FirstOrDefault()
End Using
Однако это работает нормальноесли я хочу использовать одно и то же выражение для преобразования одиночного поля в члене в AddressDTO в анонимном типе, единственный способ заставить это работать - поместить поле в массив из одного элемента, привестивыполнить запрос и затем вызвать select для этого - это кажется немного сложным, и мне интересно, есть ли лучший способ:
Using context As New DbContext
Dim mem As MemberWithAddressesDTO = _
context.Members _
.Where(Function(m) m.Person_PK = 121) _
.Select(Function(m) New MemberWithAddressesDTO With {
.Member_PK = m.Person_PK, _
.Firstname = m.Firstname, _
.DefaultAddress = {m.DefaultAddress}.AsQueryable.Select(AsAddressDTO).FirstOrDefault}
).FirstOrDefault()
End Using
В основном я хочу знать, есть ли лучший синтаксис для достижения этой строки ввыше:
.DefaultAddress = {m.DefaultAddress}.AsQueryable.Select(AsAddressDTO).FirstOrDefault}
Примечание. m.DefaultAddress - это отдельное поле типа Адрес - это не коллекция.
Есть идеи?