2017-04-13 23 views
1

在我的實體框架的應用程序,我有一個實體,稱爲Invoice.cs,這裏是什麼樣子:LINQ查詢來獲取未付發票

public class Invoice : IEntity 
{ 
    public Invoice() 
    { 
    Date = DateTime.UtcNow; 
    CreatedOn = DateTime.UtcNow; 
    } 

    public int Id { get; set; } 
    public decimal Amount { get; set; } 
    public decimal Discount { get; set; } 
    public DateTime Date { get; set; } 
    public bool IsDeleted { get; set; } 
    public bool IsSaleOrderInvoice { get; set; } 
    public InvoiceStatus Status { get; set; } 
    public DateTime CreatedOn { get; set; } 
    public DateTime? ModifiedOn { get; set; } 
    public int OrderId { get; set; } 
    public virtual Order Order { get; set; } 
    public virtual ICollection<Payment> Payments { get; set; } 
} 

public enum InvoiceStatus 
{ 
    Outstanding = 0, 
    Settled = 1, 
    Overpaid = 2 
} 

我試圖查詢數據庫獲取所有優秀的列表發票。一個優秀的發票是:

如果總對發票支付的款項的比發票金額少,那麼發票是優秀

我卡在工作了,如果發票是優秀的或不是在我的LINQ查詢,目前看起來是這樣的:

var outstandingInvoices = from inv in _context.Invoices 
    where !inv.IsDeleted && inv.Date >= startDate && inv.Date <= endDate 
    select inv; 

startDateendDate是通過在過濾結果的參數。

+0

+讓where子句 這樣你就可以inv.Amount檢查前總= inv.Payments.SUM(O => o.someamount) <>總 – m4ngl3r

回答

3

我認爲Payment實體有一個Amount屬性(否則你應該將其更改爲相應的屬性名):

var outstandingInvoices = from inv in _context.Invoices 
          where inv.Payments.Sum(p => p.Amount) < inv.Amount 
          select inv; 

,您可以選擇性添加,你現在有刪除的地位和發票日期過濾器,但從定義優秀發票,這是你應該如何檢查發票是否優秀。

生成的查詢將看起來像:

SELECT 
    result.Id, 
    result.Amount, 
    result.Discount, 
    result.IsDeleted, 
    -- etc 
    FROM (SELECT 
      i.Id, 
      i.Amount, 
      i.Discount, 
      i.IsDeleted, 
      -- etc 
      (SELECT SUM(p.Amount) 
      FROM [dbo].[Payments] p 
      WHERE i.Id = p.Invoice_Id) AS totalPayment 
      FROM [dbo].[Invoices] AS i 
    ) AS result 
    WHERE totalPayment < result.Amount 
+0

不應該在該被添加爲一個條件,以保持給出的OP,而不是唯一的條件 –

+0

@MrinalKamboj我指出,可以添加其他過濾器,但問題狀態*'我試圖查詢數據庫以獲取**所有列表**優秀髮票'* - 這就是爲什麼我提供查詢以獲得所有優秀髮票與關於添加額外過濾器的注意事項 –

+0

@SergeyBerezovskiy還有另一個剛剛曝光的「疑難雜症」。請閱讀已更新的Q. – Ciwan

1

只需使用Payments.Sum()

var result = from inv in _context.Invoices 
          where inv.Payments.Sum(payment => payment.Amount) < inv.Amount 
          select inv; 
+0

付款不是小數類型,您正在比較'金額' –

+1

是啊!改變 – Sajeetharan

+0

不應該將這作爲一個條件添加到OP給出的條件,而不是唯一的條件 –

1
var outstandingInvoices = from inv in _context.Invoices 
where !inv.IsDeleted && inv.Date >= startDate && inv.Date <= endDate 
     && inv.Payments.Count() < inv.Amount 
select inv; 

添加inv.Payments.Count() < inv.Amount到您的where子句

或者,如果你有一個amount您類和你需要總結起來,使用inv.Payments.sum(p=>p.TheAmountProperty) < inv.Amount

+0

爲什麼'計數',爲什麼不''總和' –