2016-11-17 33 views
0

我不完全確定如何命名標題,所以我希望我能夠關閉它。我的代碼在下面,而且所有東西都按照它應該的方式打印出來。我遇到的問題是,任何有0或更少的未付餘額的行都不需要打印。然而,這個數學是在不同的範圍內完成的(我相信),所以我不能說'哦,順便也沒有打印出未支付的餘額,如果它是零或更少。 如何創建一個while/if/foreach語句,當未付餘額小於或等於零時,這些語句只會將行打印到我的csv文件中?MVC C#使用0個餘額過濾器創建CSV文件

public IEnumerable<RowViewModel> GetUnpaidRR(int year, type[] types) 
     { 
      foreach (var type in types) type.Fees = type.Fees.ToList(); 
      var transactions = _db.Transactions.Where(i => i.Id.Equals(Status.Success.Id)); 
      return _db.Locations 
       .Include(i => i.Counts) 
       .Where(i => i.Owner.Report.Completed != null && i.Owner.Report.Id == year && i.Owner.primary == null) 
       .Select(location => new 
       { 
        Id = location.Owner.Report.Id, 
        Year = location.Owner.Report.year.Name, 
        Counts = location.Counts.Select(i => new 
        { 
         i.Id, 
         i.Count, 
        }), 
        FirstName = location.Owner.FirstName, 
        LastName = location.Owner.LastName, 
        paid = transactions.Where(t => t.Id == location.Owner.Report.Id).Select(n => new { n.Amount }).ToList(), 
       }) 
       .AsEnumerable() // This takes all the transactions that match the selected customer ID 
       .Select(i => new RowViewModel(types) 
       { 
        Id = i.Id.HasValue ? i.Id.Value.ToIdString() : String.Empty, 
        Year = i.Year, 
        FirstName = i.FirstName, 
        LastName = i.LastName, 
        UnpaidBalance = types.Sum(j => i.Counts.Where(k => k.Id == j.Id).Sum(k => k.Count * j.Fees.Where(p => p.Id == year).Select(p => p.Cost).SingleOrDefault())) - i.paid.Sum(j => j.Amount),// this does all the math, takes the amount charged, subtracts the amount paid and produces the balance. If this is zero or less, I don't want the row to be printed. 
       }); 
     } 
+2

快速的問題:你不能只是在你最後一個'選擇'後添加另一個'Where'? –

+0

是的......是的,我可以......謝謝你,現在我覺得啞巴哈哈。 – BlowFish

回答

1

您計算UnpaidBalance財產最後LINQ子句中:

.Select(i => new RowViewModel(types) 
{ 
    Id = i.Id.HasValue ? i.Id.Value.ToIdString() : String.Empty, 
    Year = i.Year, 
    FirstName = i.FirstName, 
    LastName = i.LastName, 
    UnpaidBalance = types.Sum(j => i.Counts.Where(k => k.Id == j.Id).Sum(k => k.Count * j.Fees.Where(p => p.Id == year).Select(p => p.Cost).SingleOrDefault())) - i.paid.Sum(j => j.Amount) 
}) 

後只需添加一個.Where()條款:

.Where(i => i.UnpaidBalance <= 0) 

如果性能是你可以一個問題將計算和過濾器移動到整個事件序列中較早的位置,但是如果您需要做的只是過濾結果,那麼這正是.Where()是。

(注意:是你如何描述過濾一些混亂要排除<= 0,一些地方和其他地方要排他性包括<= 0無論邏輯分析,你真正需要的,。然而,這只是在這.Where()條款。)

+0

等他的措辭令人困惑。滾動到代碼示例的末尾,您會看到我最初談論的內容。 '//這是完成所有的數學運算,將收取的金額減去付出的金額併產生餘額。如果這是零或更少,我不希望行被打印。# – Nkosi

+0

@Nkosi:我同意,關於什麼需要計算/過濾的描述尚不清楚。但無論他/她決定使用哪種比較,答案都是一樣的。 – David

+0

是的,我同意。那個答案仍然是一樣的 – Nkosi