2010-03-16 74 views
1

我有一個實體模型與發票,AffiliateCommissions和AffiliateCommissionPayments。Linq到實體左外部加入

發票到AffiliateCommission是一對多,AffiliateCommission到AffiliateCommissionPayment也是一對多

我試圖做一個查詢,將返回有一個委員會,但不一定有相關commissionPayment所有發票。我想用佣金顯示發票是否有佣金付款。

查詢看起來像:

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項目。

回答

0

我不知道,如果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(); 
} 

主要這裏更改的是您的joinDefaultIfEmpty行後的into acpg

+0

謝謝,我使用的EF2和DefaultIfEmpty不支持。 – radman 2010-03-16 13:21:48

0

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到實體都將合併空。因爲推斷的類型將基於AffiliateCommissionPayment.paymentDate的類型,因此可能不是可以爲空的,因此該類型是必需的。如果是這樣,你不需要演員。