LINQ с объединениями и списком <GUID> - PullRequest
5 голосов
/ 23 ноября 2010

Вот SQL, который я использовал для создания прототипа оператора LINQ. GUID в коде: List<GUID>. Я пытался в течение 3 часов и просто не понимаю. Может ли мне помочь какой-нибудь единственный человек, который может написать LINQ во сне.

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

Ответы [ 3 ]

1 голос
/ 23 ноября 2010
(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()

Объединение здесь будет ненужным, если уже есть связь между двумя таблицами в вашем отображении (тогда promotion будет просто полем из emailAddress)

0 голосов
/ 23 ноября 2010

Расширение ответа @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();

или

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 голосов
/ 23 ноября 2010

Оператор in не поддерживается linq-to-entity, но вы можете сделать это следующим образом.

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

Сгенерированный EF класс с именем EmailAddress автоматически будет иметь поле с именем PromotionJoin при условии, что в вашей таблице PromotionJoin есть ссылка внешнего ключа на первичный ключ EmailAddress.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...