2010-11-23 7 views
5

Voici le code SQL que j'ai utilisé pour prototyper l'instruction LINQ. Les GUID dans le code sont List<GUID>. J'ai essayé pendant 3 heures et je ne comprends pas. Est-ce qu'une personne seule capable d'écrire LINQ dans leur sommeil m'aidera.LINQ avec jointures et une liste <GUID>

SELECT DISTINCT [id] 
     ,[emailAddress] 
     ,[name] 
     ,[emailRunNumber] 
    FROM [emailAddress] 
    join promotionsJoin 
    on promotionsJoin.EmailAddressId = emailAddress.id 
    where promotionsJoin.promotionId in ('09464b57-f3d7-41ec-b0b1-cbc5999824bd', 
    '8bc855b2-2f01-4083-b43a-dab7b7a81ac8') AND emailRunNumber is NULL 

Répondre

0

L'opérateur in est pas pris en charge par LINQ-à-entités, mais vous pouvez le faire comme ça.

var result = YourObjectContext.EmailAddress 
       .Where(ea => ea.emailRunNumber == null 
       && (ea.PromotionJoin.promotionId == new Guid("09464b57-f3d7-41ec-b0b1-cbc5999824bd") || 
        ea.PromotionJoin.promotionId == new Guid("8bc855b2-2f01-4083-b43a-dab7b7a81ac8")); 

La classe générée EF appelé EmailAddress aura automatiquement un champ appelé PromotionJoin à condition que votre table PromotionJoin a une référence clé étrangère à la clé primaire de EmailAddress.

+0

@abatischev, oh là, a oublié de changer que lors de la copie de question. –

+0

Klaus, désolé je n'étais pas clair dans mon message original .. J'ai une liste dans le code, mais prototypé en SQL, mais je pense que l'indice d'utiliser le PromotionJoin va m'aider. (Aujourd'hui est un jour férié, je vais travailler demain en ce LINQPad demain et après mes conclusions) –

1
(from emailAddress in emailAddresses 
join promotion in promotions 
    on emailAddress.id equals promotion.EmailAddressId 
where guidsList.Contains(promotion.promotionId) 
    && promotion.emailRunNumber == null 
select new { 
    emailAddress.id, 
    emailAddress.emailAddress, 
    promotion.name, 
    promotion.emailRunNumber 
}).Distinct() 

La jointure ici sera inutile s'il y a déjà une relation entre les deux tables de votre cartographie (alors promotion sera juste un champ au large de emailAddress)

+0

Cela semble fermer ... promotion n'a pas emailAddressId mais il y a le PromotionJoin comme le souligne Klaus sur. (Aujourd'hui c'est un jour férié ... Je vais travailler ça demain sur LINQPad demain et poster mes conclusions) Merci bdukes! –

0

L'extension de la réponse @Klaus:

var result = YourObjectContext.EmailAddress 
    .Where(ea => 
     ea.emailRunNumber == null && 
     new[] 
     { 
      new Guid("09464b57-f3d7-41ec-b0b1-cbc5999824bd"), 
      new Guid("8bc855b2-2f01-4083-b43a-dab7b7a81ac8" 
     }.Contains(ea.PromotionJoin.promotionId)) 
    .Distinct(); 

ou

var result = YourObjectContext.EmailAddress 
    .Where(ea => 
     ea.emailRunNumber == null && 
     new[] 
     { 
      "09464b57-f3d7-41ec-b0b1-cbc5999824bd", 
      "8bc855b2-2f01-4083-b43a-dab7b7a81ac8" 
     }.Select(s => new Guid(s)).Contains(ea.PromotionJoin.promotionId)); 
    .Distinct(); 
+0

Je commence à voir pourquoi LINQ peut être un peu difficile à apprendre ... il y a tellement de façons de faire le travail. Comme je l'ai mentionné ci-dessus en réponse à Klaus, je m'excuse de ne pas être clair. J'ai une liste cependant aujourd'hui est un jour férié donc je vais travailler cela demain avec l'aide que vous avez fournie et poster mes conclusions. Merci, Abatishchev! –

+0

@George: Content de t'aider! Décrivez votre question plus et je vais essayer de vous aider :) – abatishchev

Questions connexes