Учитывая следующую XML-структуру в форме XDocument:
<Header><person><ID>0888-123-45</ID><Name>Joe</Name><LocationID>Loc1</LocationID><LocationName>New York</LocationName><CarName>Honda</CarName><CarYear>2000</CarYear></person><person><ID>199-20-333</ID><LocationID>My House</LocationID><LocationName>My House</LocationName><CarName>BMW</CarName><CarYear>2011</CarYear></person></Header>
В ней участвуют 3 объекта:
Person :
- GUID, ID (varchar), Имя (varchar), LocationID (GUID местоположения)
Автомобиль :
- GUID, PersonID (GUID человека)), CarName (varchar), CarYear (varchar)
Местоположение :
- GUID, LocationID (varchar), LocatioName (varchar)
Я хочу добиться следующих шагов:
- Получить разные местоположения для всех людей в XDocument
- Если местоположение в XDocument существует в контексте данных,не вставляйте, иначе вставьте
- Вставьте всех людей и их соответствующие машины.
Это то, что у меня есть, и выдает ошибку, поскольку запрос представляет собой сочетание обоих Linq дляСущности и Linq to XML.Я признателен за любые идеи и предложения для лучшего способа ее решения.Нет для циклов, так как синтаксический анализ XDocument с циклом for выполняется медленно.
Dim fileLocs = (From p In xmlDoc.<Header>.<Person>
Select New location With {.locID = Guid.NewGuid(), _
.locationID = If(p.<LocationID> Is Nothing, Nothing, p.<LocationID>.Value), _
.locLabel = If(p.<LocationName> Is Nothing, Nothing, p.<LocationName>.Value)})
Dim filteredFileLocs = From l In fileLocs
Where l.locationID IsNot Nothing AndAlso l.locationID <> "" AndAlso
(From loc In ctx.locations
Where loc.locationID = l.locationID AndAlso loc.locLabel = l.locLabel
Select loc).Count = 0
Select l
Dim sysLocs = (From loc In ctx.locations Select loc)
Dim allLocs = filteredFileLocs.Union(sysLocs)
Dim pers As IEnumerable(Of person) = (From p In xmlDoc.<Header>.<Person>
Select New Person With {.personID = Guid.NewGuid(), .ID = p.Element(XName.Get("ID")).Value, _
.locID = If(p.<locationID> IsNot Nothing AndAlso p.<locationID>.Value <> "", CType(Nothing, Guid?), _
(From sl In allLocs
Where sl.locationID = p.Element(XName.Get("LocationID")).Value AndAlso
sl.locLabel = p.Element(XName.Get("LocationName")).Value
Select sl.locID)), _
.Name = p.Element(XName.Get("Name")).Value})
For Each l In filteredFileLocs
ctx.locations.AddObject(l)
Next
For Each p In pers
ctx.persons.AddObject(p)
Next
Ошибка в строке Dim pers: "Указанное приведение недопустимо."