2011-10-22 4 views
10

Mam dwie tabele, Table1 i Table2. Chcę wykonać, powiedzmy, lewe sprzężenie zewnętrzne:Zaznacz wszystkie kolumny po JOIN w LINQ

var myOutput = from object1 in Table1 
       join object2 in Table2 
       on object1.Property1 equals object2.Property2 into Table3 
       from output in Table3.DefaultIfEmpty() 
       select new 
        { 
         object1.Property1, 
         object1.Property2, 
         //... 
         output.Property3, 
         output.Property4, 
         //... 
        }; 

Jak można zauważyć, chcę zaznaczyć wszystkie właściwości obu obiektów z otrzymanej tabeli (The enumerables uwzględnione podczas łączenia zawierają obiekty niektórych rodzajów - są one różne dla obu relacji). Oczywiście mogę wybrać właściwości w anonimowym wyborze, jak pokazano w przykładzie.

Moje pytanie brzmi: jak uniknąć ręcznego określania wszystkich właściwości? Chciałbym mieć coś w rodzaju SELECT * FROM TABLE3, gdzie TABLE3 jest wynikową relacją (po dołączeniu do TABLE1 i TABLE2).

Z góry dziękuję za wskazówki.

Odpowiedz

10

Musisz określić każdy ręcznie, jeśli chcesz wyświetlać w postaci spłaszczonej. Inną opcją jest, aby twój kombinowany typ zawierał oba obiekty, a obiekty będą naturalnie przenosić ich właściwości.

select new 
{ 
    Object1 = object1, 
    Object2 = output 
}; 

A ty z nim pracować jak myObj.Object1.Property1, myObj.Object2.Property4 itp

Ostatnią opcją, która nadal wymaga ręcznej pracy jest określenie odpowiedniego rodzaju i posiada konstruktora lub metody, która wykonuje budowniczy praca polegająca na segmentowaniu twoich właściwości obiektu na spłaszczony typ. Nadal wykonujesz ręczne mapowanie, ale izolujesz je od logiki zapytania.

select new CombinedType(object1, output); 
//or 
select builder.GetCombinedType(object1, output); 
+0

Czy pierwsza opcja nie używa metody ToString() podczas przypisania? W takim przypadku otrzymam na przykład wartości "Namespace.MyType" w kolumnie o nazwie Object1 po wykonaniu myOutput.ToArray() ... – Jamie

+0

Nie, nie wywołałoby to 'ToString()', co daje wyobrażenie, że ? Czy wiążesz go z jakimś formantem interfejsu użytkownika? Kontrolka * może wywołać 'ToString()', ale samo zapytanie jest autentyczne, tt po prostu używa całego obiektu i odwzorowuje go na właściwość. –

+0

Twój komentarz dał mi pewien pomysł - stworzyłem nową klasę zawierającą odniesienia do obu obiektów. Wtedy łatwo jest związać się z pewnymi właściwościami tych znaków :) – Jamie