2013-10-10 9 views
22

Mam wriiten LINQ przyłączyć zapytanie i chciałbym przyjmować wartości, jeśli jeden z nich jest pusty ...LINQ przyłączyć iquery, jak używać defaultifempty

Kod:

var Details = 

UnitOfWork.FlightDetails 
      .Query() 
      .Join 
      (
       PassengersDetails, 
       x => x.Flightno, 
       y => y.FlightNo, 
       (x, y) => new 
       { 
        y.PassengerId, 
        y.classType, 
        x.Flightno, 
        x.FlightName, 
       } 
     ); 

I chciałby używać coś takiego ..

"Above query".DefaultIfEmpty 
(
    new 
    { 
     y.PassengerId, 
     y.classType, 
     string.Empty, 
     string.Empty 
    } 
); 

„FlightDetails” jest Idatarepository typ na klasy i „PassengerDetails” jest IQueryable lokalny wynik zmienna. W jaki sposób mogę uzyskać wyniki z identyfikatorem pasażera i klasą Clas, z których nie ma żadnych lotów i nazw lotów uwzględnionych w ogólnych wynikach.

+0

Nie jestem pewien, czy 'DefaultIfEmpty()' będzie działał z metodami anonimowymi. Spróbuj zdefiniować klasę i ją wykorzystać. –

+0

Poszukujesz składni "Left Outer Join", na którą odpowiedziano w innych pytaniach. Oto top dla składni Method/Lambda LINQ: http://stackoverflow.com/questions/584820/how-do-you-perform-a-left-outer-join-using-linq-extension-methods – Ocelot20

Odpowiedz

46

Po prostu chcesz zrobić lewe sprzężenie zewnętrzne. Sposób, w jaki obecnie używasz metody DefaultIfEmpty, polega na tym, że jeśli cała lista jest pusta, podajesz pojedynczy domyślny wpis.

Powinieneś dołączyć do PassengerDetails i dla każdej listy szczegółów dla pasażerów zadzwoń do domyślnej, jeśli jest pusta. Jest to odpowiednik lewego zewnętrznego sprzężenia i wygląda trochę tak:

var data = from fd in FlightDetails 
      join pd in PassengersDetails on fd.Flightno equals pd.FlightNo into joinedT 
      from pd in joinedT.DefaultIfEmpty() 
      select new { 
         nr = fd.Flightno, 
         name = fd.FlightName, 
         passengerId = pd == null ? String.Empty : pd.PassengerId, 
         passengerType = pd == null ? String.Empty : pd.PassengerType 
         } 
+0

dzięki! zaoszczędziło mi to wiele czasu. –

Powiązane problemy