Linq to Entity осталось внешнее соединение - PullRequest
1 голос
/ 16 марта 2010

У меня есть модель Entity со счетами, AffiliateCommissions и AffiliateCommissionPayments.

Счет для AffiliateCommission - это один для многих, Партнерская комиссия для AffiliateCommissionPayment также является для многих

Я пытаюсь сделать запрос, который вернет все счета-фактуры, которые имеют комиссию, но не обязательно имеют связанную комиссиюPayment. Я хочу показать счета с комиссиями, независимо от того, есть они комиссионные или нет.

Запрос выглядит примерно так:

using (var context = new MyEntitities())
{
   var invoices = from i in context.Invoices
   from ac in i.AffiliateCommissions
   join acp in context.AffiliateCommissionPayments on ac.affiliateCommissionID equals acp.AffiliateCommission.affiliateCommissionID 
   where ac.Affiliate.affiliateID == affiliateID
   select new
   {
      companyName = i.User.companyName,
      userName = i.User.fullName,
      email = i.User.emailAddress, 
      invoiceEndDate = i.invoicedUntilDate,
      invoiceNumber = i.invoiceNumber,
      invoiceAmount = i.netAmount,
      commissionAmount = ac.amount,
      datePaid = acp.paymentDate,
      checkNumber = acp.checkNumber
   };
   return invoices.ToList();
}

Этот запрос выше возвращает только товары с AffiliateCommissionPayment.

Ответы [ 2 ]

0 голосов
/ 17 марта 2010

Почти всегда ошибочно использовать join в LINQ to SQL и LINQ to Entities .

Предполагая, что ассоциация от AffiliateCommission до AffiliateCommissionPayment называется Payment, вы можете просто сделать:

using (var context = new MyEntitities())
{
   var invoices = from i in context.Invoices
   from ac in i.AffiliateCommissions
   where ac.Affiliate.affiliateID == affiliateID
   select new
   {
      companyName = i.User.companyName,
      userName = i.User.fullName,
      email = i.User.emailAddress, 
      invoiceEndDate = i.invoicedUntilDate,
      invoiceNumber = i.invoiceNumber,
      invoiceAmount = i.netAmount,
      commissionAmount = ac.amount,
      datePaid = (DateTime?) ac.Payment.paymentDate,
      checkNumber = (int?) ac.Payment.checkNumber
   };
   return invoices.ToList();
}

LINQ to SQL и LINQ to Entities будут объединять нули. Приведения необходимы, потому что предполагаемый тип будет основан на типе AffiliateCommissionPayment.paymentDate, который может не иметь значения NULL. Если это так, вам не нужен актерский состав.

0 голосов
/ 16 марта 2010

Я не уверен, поддерживает ли это EF (и не уверен, используете ли вы EF2 или EF4), но это решение в Linq2Sql, поэтому стоит попробовать:

using (var context = new MyEntitities()) 
{ 
   var invoices = from i in context.Invoices 
   from ac in i.AffiliateCommissions 
   join acp in context.AffiliateCommissionPayments on ac.affiliateCommissionID equals acp.AffiliateCommission.affiliateCommissionID into acp_join
   from acp_join_default in acpg.DefaultIfEmpty()
   where ac.Affiliate.affiliateID == affiliateID 
   select new 
   { 
      companyName = i.User.companyName, 
      userName = i.User.fullName, 
      email = i.User.emailAddress,  
      invoiceEndDate = i.invoicedUntilDate, 
      invoiceNumber = i.invoiceNumber, 
      invoiceAmount = i.netAmount, 
      commissionAmount = ac.amount, 
      datePaid = acp.paymentDate, 
      checkNumber = acp.checkNumber 
   }; 
   return invoices.ToList(); 
} 

Основное изменение здесь - это into acpg после вашего join и строка DefaultIfEmpty.

...