2010-11-23 16 views
5

Aquí está el SQL que utilicé para prototipar la instrucción LINQ. Los GUID's en el código son List<GUID>. Intenté durante 3 horas y simplemente no lo entendí. ¿Podría una suela amable que puede escribir LINQ mientras duerme ayudarme?LINQ con combinaciones y una lista <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 

Respuesta

0

El operador in no es compatible con LINQ a las entidades, pero que podría hacerlo de esta manera.

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 clase generada EF llamada EmailAddress tendrá automáticamente un campo llamado PromotionJoin siempre que su mesa PromotionJoin tiene una referencia de clave externa a la clave primaria de EmailAddress.

+0

@abatischev, oops, se olvidó de cambiar eso cuando se copia desde pregunta –

+0

Klaus, lo siento, no estaba claro en mi publicación original ... Tengo una lista en el código, pero la prototipé en SQL, sin embargo, creo que la clave del uso de PromotionJoin me ayudará. (Hoy es un día de fiesta lo resolveré mañana en LINQPad mañana y publico mis hallazgos) –

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 unirse aquí será innecesario si ya existe una relación entre las dos tablas de la asignación (continuación promotion será sólo un campo fuera de emailAddress)

+0

Esto parece cerrado ... la promoción no tiene emailAddressId pero está el PromotionJoin como señala Klaus. (Hoy es día festivo ... Lo resolveré mañana en LINQPad mañana y publicaré mis hallazgos) ¡Gracias, bdukes! –

0

Extendiendo @Klaus' respuesta:

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(); 

o

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

Estoy empezando a ver por qué LINQ puede ser un desafío aprender ... hay muchas maneras de hacer el trabajo. Como mencioné anteriormente en respuesta a Klaus, me disculpo por no ser claro. Tengo una lista , sin embargo, hoy es día feriado, así que lo resolveré mañana con la ayuda que la gente amable me ha proporcionado y publico mis hallazgos. Gracias, Abatishchev! –

+0

@George: ¡Me alegra ayudar! Describe más tu pregunta y trataré de ayudarte :) – abatishchev

Cuestiones relacionadas