2012-11-12 1 views
2

J'ai une classe Facture que je veux avoir plusieurs paquets, mais je veux seulement que ces paquets soient là s'ils ont été expédiés plus tard que le dernier enregistrement dans l'enregistrement. J'ai utilisé "into" pour inclure les autres groupes dans l'objet, mais je n'arrive pas à joindre les paquets spécifiques.linq à sql "dans" conditionnel avec select

from invoice in invoices 
join item in InvoiceItems on invoice.InvoiceId equals item.InvoiceId into items // Gives the item collection 
join package in packages on invoice.InvoiceId equals package.InvoiceId // only want the packages that satisfy the condition... 
where package.ShipDate > (subquery) 

Cette requête fonctionnerait, sauf que je recevrais plusieurs fois les mêmes factures s'il y a plusieurs paquets. Si j'ajoute "en paquets" à la fin de la jointure, je ne sais pas comment obtenir seulement les paquets qui satisfont la deuxième condition.

Le sous-requête est:

(from lastSentRecord in records 
where lastSentRecord.InvoiceID == invoice.InvoiceID 
orderby lastSentRecord.SendDateTime descending 
select lastSentRecord.SendDateTime ?? new DateTime()).First() 

La partie importante de la structure de classe est

Invoice --- InvoiceID 
Package --- InvoiceID, ShipDate 
Record --- InvoiceID, SendDateTime, EmailType 
+0

Où 'Record' entre? En particulier, cela dépend-il de «facture»? –

+0

pouvez-vous fournir la structure de vos ensembles de données? – m4ngl3r

+0

@JonSkeet L'enregistrement est une notification disant que nous devons envoyer un e-mail. Il a InvoiceID, EmailType, SentDate. Je vais ajouter la sous-requête à la question –

Répondre

0

En tant que travail autour, je ne les suivantes:

from invoice in invoices 
join packge in packages on invoice.InvoiceId equals package.InvoiceId into packages 
where (from package in packages 
     where package.InvoiceId == invoice.InvoiceId 
     where package.ShipDate > timeSent 
     select 1).Any() 
select new {packages.Where(p => p.ShipDate > timeSent)} 

Il fait le travail, mais j'aimerais le faire une meilleure façon. Je vais laisser cela ouvert un peu plus longtemps pour voir si quelqu'un a des réponses, alors je vais accepter cela comme une réponse.

0

Vous pouvez modifier vos eux faire deux requêtes distinctes et satisfaire la deuxième condition (appeler probablement la seconde une première afin que vous puissiez créer la variable pour le où). L'article ci-dessous vous montre comment vous pouvez le faire en le faisant dans l'instruction select.

This would also solve your problem

+0

Je sais comment utiliser des requêtes séparées. Je ne sais pas comment ils s'appliqueraient dans cette situation. –