2017-02-21 2 views
0

Я Извлечение записей из БД и создавая следующий объект:Как использовать Linq для создания уникальной коллекции, которая содержит коллекцию

 public class RemittanceBatchProcessingModel 
     { 
      public string FileId { get; set; } 
      public string SourceFileName { get; set; } 
      public string BatchCode { get; set; } 
      public string BatchType { get; set; } 
      public decimal PaymentAmount { get; set; } 
      public string BillingSystemCode { get; set; } 
     } 

Пример объектов, созданных после дб чтения:

FileId | SourceFileName | BatchCode | BatchType | PaymentAmt |BillingCode 
    1 | test.file1.txt | 100  | S   | 1000.00 | Exc 
    1 | test.file1.txt | 100  | S   | 2000.00 | Exc 
    1 | test.file1.txt | 200  | N   | 500.00 | Adc 
    2 | test.file2.txt | 300  | S   | 1200.00 | Exc 
    2 | test.file2.txt | 300  | S   | 1500.00 | Exc 

I хотите создать объект, в котором есть коллекция уникальных файлов, в которых есть коллекция каждой суммарной партии в файле. Например,

Collection of Unique Files: 
FileId | SourceFileName | BatchCode | BatchType | BatchTotal |RecordCount 
    1 | test.file1.txt | 100  | S   | 3000.00 | 2 
    1 | test.file1.txt | 200  | N   | 500.00 | 1 
    2 | test.file2.txt | 100  | S   | 1700.00 | 2 

Я могу создать свою коллекцию партий, без выпуска проблемы я имею выяснить, как создать коллекцию уникальных файлов с правильными партиями в них. Я пытаюсь это с помощью следующего:

private static RemittanceCenterFilesSummaryListModel SummarizeFiles(RemittanceCenterSummaryListModel remittanceCenterSummaryListModel) 
    { 
     var summarizedBatches = SummarizeBatches(remittanceCenterSummaryListModel); 

        var fileResult = remittanceCenterSummaryListModel.RemittanceBatchSummaryRecord.GroupBy(x => new { x.FileId, x.SourceFileName }) 
      .Select(x => new RemitanceCenterFileSummarizedModel() 
      { 
       FileId = x.Key.FileId, 
       SourceFileName = x.Key.SourceFileName, 
       ScannedBatchCount = x.Count(y => y.BatchType == "S"), 
       ScannedBatchAmount = x.Where(y => y.BatchType == "S").Sum(y => y.PaymentAmount), 
       NonScannedBatchCount = x.Count(y => y.BatchType != "S"), 
       NonScannedBatchAmount = x.Where(y => y.BatchType != "S").Sum(y => y.PaymentAmount), 
      }); 

     var summaryListModel = CreateSummaryFilesListModel(fileResult); 
     summaryListModel.Batches = summarizedBatches.RemittanceBatchSummary; 
     return summaryListModel; 
    } 
    private static RemittanceCenterFilesSummaryListModel CreateSummaryFilesListModel(IEnumerable<RemitanceCenterFileSummarizedModel> summaryModels) 
    { 
     var summaryModelList = new RemittanceCenterFilesSummaryListModel(); 

     foreach (var summaryFileRec in summaryModels) 
     { 
      var summaryModel = new RemitanceCenterFileSummarizedModel 
      { 
       FileId = summaryFileRec.FileId.ToString(CultureInfo.InvariantCulture), 
       SourceFileName = summaryFileRec.SourceFileName.ToString(CultureInfo.InvariantCulture), 
       ScannedBatchCount = summaryFileRec.ScannedBatchCount, 
       ScannedBatchAmount = summaryFileRec.ScannedBatchAmount, 
       NonScannedBatchCount = summaryFileRec.NonScannedBatchCount, 
       NonScannedBatchAmount = summaryFileRec.NonScannedBatchAmount 
      }; 

      summaryModelList.RemittanceFilesSummary.Add(summaryModel); 
     } 

     return summaryModelList; 
    } 
+0

ли FILEID единственного свойства, которое является уникальным между партиями? Не могли бы вы просто .GroupBy()? – Joe

+0

FileId - единственный уникальный ключ, который можно использовать для группировки партий «да». – Jason

ответ

0

Вы можете сгруппировать его на 4 колонки, включая BatchType и BatchCode, а также и выбрать Count и суммируемых Сумму как:

var fileResult = remittanceCenterSummaryListModel.RemittanceBatchSummaryRecord 
        .GroupBy(x => new 
            { 
            x.FileId, 
            x.SourceFileName, 
            x.BatchType, 
            x.BatchCode 
            }) 
        .Select(x => new 
           { 
            FileId = x.Key.FileId, 
            SourceFileName = x.Key.SourceFileName, 
            BatchType = x.Key.BatchType, 
            BatchCode = x.Key.BatchCode, 
            BatchTotal= x.Sum(y=>y.PaymentAmt), 
            RecordCount = x.Count() 
          }); 
0

Я думаю, вы нужно GroupBy FileId & BatchType вместо FileName: -

var fileResult = remittanceCenterSummaryListModel.RemittanceBatchSummaryRecord 
      .GroupBy(x => new { x.FileId, x.BatchType }) 
      .Select(x => 
      { 
       var firstObj = x.FirstOrDefault(); 
       return new RemitanceCenterFileSummarizedModel() 
       { 
        FileId = x.Key.FileId, 
        SourceFileName = firstObj.SourceFileName, 
        BatchCode = firstObj.BatchCode, 
        BatchType = x.Key.BatchType, 
        BatchTotal = x.Sum(z => z.PaymentAmt), 
        RecordCount = x.Count() 
       }; 
      }); 

Учитывая, что FileId соответствует картам SourceFileName & BatchCode составляет BatchType, вы можете просто сохранить первый набор в переменной, как я сделал в firstObj, чтобы получить соответствующие значения, которые не сгруппированы. Перед доступом к соответствующим свойствам проверьте нулевые значения, так как это может вызвать NRE, если набор не найден.

0

Для чистого LinQ Неправительственного беглого

var files = new[] { 
       new { FileId = 1, SourceFileName = "test.file1.txt" , BatchCode = 100 , BatchType = "S", PaymentAmt = 1000.00 , BillingCode = "Exc" }, 
       new { FileId = 1, SourceFileName = "test.file1.txt" , BatchCode = 100 , BatchType = "S", PaymentAmt = 2000.00 , BillingCode = "Exc" }, 
       new { FileId = 1, SourceFileName = "test.file1.txt" , BatchCode = 200 , BatchType = "N", PaymentAmt = 500.00 , BillingCode = "Adc" }, 
       new { FileId = 1, SourceFileName = "test.file2.txt " , BatchCode = 300 , BatchType = "S", PaymentAmt = 1200.00 , BillingCode = "Exc" }, 
       new { FileId = 1, SourceFileName = "test.file2.txt " , BatchCode = 300 , BatchType = "S", PaymentAmt = 1500.00 , BillingCode = "Exc" } 
      }; 

      var result = from file in files 
         group file by new { file.FileId, file.BatchCode } into fileBachGroups 
         select new 
         { 
          FileId = 1, 
          SourceFileName = fileBachGroups.First().SourceFileName, 
          BatchCode = fileBachGroups.Key.BatchCode, 
          BatchType = fileBachGroups.First().BatchType, 
          BatchTotal = fileBachGroups.Sum(f => f.PaymentAmt), 
          RecordCount = fileBachGroups.Count() 
         }; 

      Console.WriteLine("FileId | SourceFileName | BatchCode | BatchType | BatchTotal |RecordCount"); 

      foreach (var item in result) 
      { 
       Console.WriteLine("{0} | {1} | {2} | {3} | {4} | {5}",item.FileId,item.SourceFileName, item.BatchCode, item.BatchType, item.BatchTotal, item.RecordCount); 
      } 
Смежные вопросы