Linq to Entities и Linq to XML - PullRequest
       2

Linq to Entities и Linq to XML

0 голосов
/ 20 января 2011

Учитывая следующую 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)

Я хочу добиться следующих шагов:

  1. Получить разные местоположения для всех людей в XDocument
  2. Если местоположение в XDocument существует в контексте данных,не вставляйте, иначе вставьте
  3. Вставьте всех людей и их соответствующие машины.

Это то, что у меня есть, и выдает ошибку, поскольку запрос представляет собой сочетание обоих 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: "Указанное приведение недопустимо."

1 Ответ

0 голосов
/ 21 января 2011

Что я заметил, так это то, что предложение, в котором задан .locID,

(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)

возвращает ienumberable, и он присваивается .LocID, который является GUID, так что это должно быть причиной ошибки.нужно добавить FirstOrDefault, First, SingleOrDefault или Single, как это

(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).FirstOrDefault()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...