【问题标题】:Linq to Entity Left Outer JoinLinq to Entity Left Outer Join
【发布时间】:2010-03-16 13:07:33
【问题描述】:

我有一个包含 Invoices、AffiliateCommissions 和 AffiliateCommissionPayments 的实体模型。

发票到 AffiliateCommission 是一对多,AffiliateCommission 到 AffiliateCommissionPayment 也是一对多

我正在尝试进行查询,该查询将返回所有有佣金但不一定有相关佣金付款的发票。我想显示带有佣金的发票,无论他们是否支付佣金。

查询看起来像:

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 的项目。

【问题讨论】:

    标签: c# linq linq-to-entities left-join


    【解决方案1】:

    我不确定 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(); 
    } 
    

    这里的主要变化是join 后面的into acpgDefaultIfEmpty 行。

    【讨论】:

    • 谢谢,我使用的是 EF2,不支持 DefaultIfEmpty。
    【解决方案2】:

    It's almost always a mistake to use join in LINQ to SQL and LINQ to Entities

    猜测从AffiliateCommissionAffiliateCommissionPayment的关联被称为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 的类型,它可能不可为空。如果是,则不需要演员表。

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2010-12-13
      • 2011-04-26
      • 2011-08-03
      相关资源
      最近更新 更多