2017-04-13 94 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

为什么'计数',为什么不''总和' –