2011-07-04 3 views
1
var grid = new System.Web.UI.WebControls.GridView(); 
     grid.DataSource = from booking in bookings 
         join f in getallAttendees on booking.UserID equals f.UserID into fg 
         from fgi in fg.DefaultIfEmpty() //Where(f => f.EventID == booking.EventID) 
          where 
           booking.EventID == id 

          select new 
          { 
           EventID = booking.EventID, 
           UserID = booking.UserID, 
           TrackName = booking.Name, 
           BookingStatus = booking.StatusID, 
           AttendeeName = booking.FirstName, 
          // name = account.FirstName, 
           AmountPaid = booking.Cost, 
           AttendeeAddress = booking.DeliveryAdd1, 
           City = booking.DeliveryCity, 
           Postcode = booking.Postcode, 
           Date = booking.DateAdded, 
           product = fgi == null ? null : fgi.productPurchased 
         }; 

table design Booking:Problèmes avec LINQ to SQL se joindre à la requête

ID, EventID, UserID, BookingStatus, AmountPaid, AttendeeAddress, City, Date 

table design Product:

ID, EventID, SecondDriver, Apples, Bananas, SecondItem 

L'association entre la réservation et la table des produits est beaucoup à beaucoup et La clé étrangère est UserID

La requête Linq-to-SQL ci-dessus tourne les données des seuls utilisateurs dont booking.UserID equals att.UserID, ce que je veux est de renvoyer tous les utilisateurs de cet événement particulier aussi avec des pommes et des champs de banane s'ils ont acheté else remplir null dans ces colonnes.

Toutes les solutions possibles ou exemples seront très appréciés.

Répondre

1

Je pense que vous cherchez un équivalent à une jointure à gauche. Vous pouvez accomplir cela en utilisant la méthode d'extension DefaultIfEmpty(). Modifier votre instruction de jointure et ajouter un autre from in comme ceci:

join at in getallAttendees on booking.UserID equals at.UserID into attg 
from att in attg 

Dans votre instruction select vous pouvez utiliser l'opérateur ternaire ? : comme ceci:

SecondItem = att == null ? null : att.SecondItem, 

Modifier

Votre bookings et getallAttendees IQueryable doit provenir du même contexte si vous voulez les joindre ensemble.

Sinon, vous devrez utiliser getallAttendees.ToList() et bookings.ToList()

+0

ok laissez-moi essayer –

+0

encore obtenir l'expression LINQ spécifiée contient des références à des requêtes qui sont associées à des contextes différents. erreur –

+0

nous aurons besoin de voir la requête mise à jour avec le message d'erreur – Aducci