web-dev-qa-db-fra.com

Linq join iquery, comment utiliser defaultifempty

J'ai écrit une requête de jointure linq et je voudrais prendre les valeurs, si l'une d'entre elles est vide ...

Code:

var Details = 

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

Je voudrais utiliser quelque chose comme ..

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

FlightDetails est Idatarepository tapez sur une classe et PassengerDetails est IQueryable résultat de la variable locale. Comment puis-je obtenir des résultats avec PassengerId et Classtype sans flightno et flightname inclus dans les résultats globaux?

29
user1032957

Vous voulez essentiellement faire une jointure externe gauche. La façon dont vous utilisez actuellement la méthode DefaultIfEmpty est que si la liste entière est vide, vous fournissez une seule entrée par défaut.

Vous devez vous joindre à PassengerDetails et pour chaque liste de détails des passagers, appelez la valeur par défaut si vide. C'est l'équivalent d'une jointure externe gauche et cela va quelque chose comme ceci:

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
                       }
63
Kristof