2010-11-09 18 views
10

Próbuję utworzyć kolekcję hierarchiczną przy użyciu Entity Framework - patrz zapytanie poniżej - każdy członek danej firmy ma członka nadrzędnego - ale przy próbie wykonania tego otrzymuję następujący wyjątek:Wyjątek kwerendy modułu hierarchicznej jednostki

System.NotSupportedException: Typ „Państwa” pojawia się w dwóch strukturalnie niekompatybilnych inicjalizacji w pojedynczego LINQ podmiotom zapytania. Typ można zainicjować w dwóch miejscach w w tej samej kwerendzie, ale tylko jeśli te same właściwości są ustawione w obu miejscach i , te właściwości są ustawione w tej samej kolejności .

Po usunięciu przypisania ParentMember działa - wszelkie pomysły na to, co się dzieje?

Odpowiedz

12

Nie próbowałem tego, ale komunikat o błędzie daje wskazówkę: nie ustawiasz tych samych właściwości w tej samej kolejności w obu miejscach.

Co stanie się, jeśli spróbujesz ustawić właściwość ID na zewnętrznym elemencie członkowskim()?

+0

Właśnie uaktualniony kod w pytaniu, aby odzwierciedlić rzeczywisty kod - Mam dokładnie te same właściwości są ustawione w takiej samej kolejności, z wyjątkiem ustawienie właściwości ParentMember z ParentMember, jeśli to ma sens. –

+1

W rzeczywistości nadal nie ustawiasz wszystkich tych samych parametrów: zewnę trzna nazwa i rodzicielski, podczas gdy ty ustawiasz tylko nazwę wewnętrzną. Spróbuj przypisać właściwość zerową. – chris

1

Otrzymasz rekursję rekordów członków, gdy spróbujesz pobrać te same pola w każdym z nich. Nie można po prostu ustawić ostatniego rekordu nadrzędnego na zero.

Chciałbym odzyskać to, co mogłem, a następnie zbudować rekord z dalszymi pytaniami. Zwróć uwagę, że Twój podmiot firmy będzie wymagał pola ParentId lub podobnego.

var members = 
    return from c in _Entities.Company 
    select new Member() 
    { 
    Name = c.Name, 
    ParentId = c.ParentId 
    }; 

Teraz należy powtórzyć i dodać do rekordów nadrzędnych.

foreach (var member in members) 
{ 
    member.ParentMember = new Member 
    { 
     Name = _Entities.Company.First(c => c.Id == member.ParentId).Name 
    }; 
} 
2

Spróbuj

return (from c in _Entities.Company 
       where c.Deleted == false 
       select new 
       { 
        c.Name, 
        ParentMember = new 
        { 
         c.ParentMember.Name 
        } 
       }) 
.AsEnumerable() 
.Select(c=> new Member 
       { 
        Name = c.Name, 
        ParentMember = new Member 
        { 
         Name = c.ParentMember.Name 
        } 
       }); 
+2

+1 Ta sytuacja catch-22 po prostu mnie ugryzła, i to było rozwiązanie, które wymyśliłem samodzielnie. Mniej elegancki niż miałem nadzieję, i trochę marnotrawny, ponieważ musimy podwoić proces tworzenia obiektów, ale mimo to skuteczny. –

Powiązane problemy