2016-08-26 9 views
1

データベースからデータを取得すると、次の構造になります。グループInputFileIdFilenameで、最大値を選択するのはFailedです。Linq C#が最大値に基づく

InputFileId = 12, FileName = "Filename_12", Failed = false 
InputFileId = 13, FileName = "Filename_13", Failed = false 
InputFileId = 13, FileName = "Filename_13", Failed = true 

今、私はこの結果を見てみたい:

InputFileId = 12, FileName = "Filename_12", Failed = false 
InputFileId = 13, FileName = "Filename_13", Failed = true 

私がこれまで持ってLINQクエリは次のとおりです。

Files = (this.InputFileStatusService.GetFilesUploadedByDay(StartOfDay(SelectedDate), EndOfDay(SelectedDate), this.Deal.Id)) 
      .Where(a => a.InputFileId > 0) 
      .GroupBy(m => new { m.InputFileId, m.FileName, Failed = m.Failed ? 1 : 0 }) 
      .Select(m => new 
      { 
       InputFileId = m.Key.InputFileId, 
       FileName = m.Key.FileName, 
       Failed = m.Max(x=>x.Failed) 
      }).ToList(); 

しかし、これは誰もが持っていない、動作しませんこれのための解決策?

+0

「最大値を選択してください」とは、trueの場合はTrueを返します。 –

+0

'InputFileId'でグループ化しますか?しかし、あなたが 'InputFileId = 13、FileName = "Filename_13"、Failed = false'ではなく、' InputFileId = 13、FileName = "Filename_13"、Failed = true " –

+0

はい、同じInputFileIdとFilenameに複数の値がある場合は、ファイルが失敗したことを示すだけで、Failedが真である必要があります。 – Walter

答えて

4

Any

Failed = m.Any(x => x.Failed) 

Maxを交換し、Failed = m.Failed ? 1 : 0を除去するのに十分であるべきin

.GroupBy(m => new { m.InputFileId, Failed = m.Failed ? 1 : 0 }) 

これらの列は互いに対応しているように見えるので、m.FileNameのグループを追加することもできます。

4

あなたはFailedでグループ分けしていますので、各グループに1つのアイテムがあります - Max(Failed)はそのキーと同じになります。

のみInputFieldIdすることにより、グループとグループ内AnyFailedためtrueの価値を持っているかどうかを確認:

Files = (this.InputFileStatusService.GetFilesUploadedByDay(StartOfDay(SelectedDate), EndOfDay(SelectedDate), this.Deal.Id)) 
      .Where(a => a.InputFileId > 0) 
      .GroupBy(m => new { m.InputFileId, m.FileName }) 
      .Select(m => new 
      { 
       InputFileId = m.Key.InputFileId, 
       FileName = m.Key.FileName, 
       Failed = m.Any(x => x.Failed) 
      }).ToList(); 
関連する問題