2016-11-17 16 views
0

タイトルの名前を付ける方法が正確ではないので、私はそれを近くにしたいと思っています。私のコードは以下の通りです。私が問題を抱えているのは、未払いの残高が0以下の行は印刷されない必要があるということです。しかし、この数学は別の範囲で行われます(私は信じています)。そうすれば、ゼロ以下であれば未払いの残高をプリントアウトしないと言うこともできません。 未払いの残高がゼロ以下の場合にのみ行をCSVファイルに出力するwhile/if/foreach文を作成するにはどうすればよいですか?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

あなたは最後のLINQの句でUnpaidBalanceプロパティ計算:パフォーマンスが問題になる場合は、あなたができることがあり

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

.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()はのためです。

(注意:いくつかの混乱は、あなたがフィルタを記述する方法であり、あなたがにしたいいくつかの場所で<= 0を除外し、にしたい他の場所でのみ<= 0を含め、あなたが実際に必要なものは何でもロジック、。。しかし、単に.Where()節に入るでしょう)

+0

彼の言葉が混乱するのを待つ。コード例の最後までスクロールすると、もともと私が何を話していたのかが分かります。 '//これはすべての数学を行い、課金された金額を取り、支払った金額を減算して残高を生成します。これがゼロ以下の場合は、行を印刷したくありません。 ' – Nkosi

+0

@Nkosi:計算/フィルタリングする必要があるものの正確な説明は不明です。しかし、彼/彼女が使用することを決める比較が何であれ、答えは同じままです。 – David

+0

はい私は同意します。その答えは同じままです – Nkosi

関連する問題