使用LINQ查找字段的唯一计数

时间:2017-02-15 14:54:04

标签: c# linq

我正在尝试确定对象集合中特定字段的Distinct计数。

    private static RemittanceCenterBatchSummaryListModel SummarizeFields(RemittanceCenterSummaryListModel remittanceCenterSummaryListModel)
    {
        var result = remittanceCenterSummaryListModel.RemittanceBatchSummaryRecord.GroupBy(x => new{x.FileId, x.SourceFileName, x.BatchCode, x.BatchType})
            .Select(x => new RemittanceCenterBatchSummarizedModel()
            {
                FileId = x.Key.FileId,
                SourceFileName = x.Key.SourceFileName,
                BatchCode = x.Key.BatchCode,
                BatchType = x.Key.BatchType,
                DetailRecordCountAdc = x.Count(y => y.BillingSystemCode == BillingSystemCode.Adc),
                DetailRecordCountNotAdc = x.Count(y => y.BillingSystemCode == BillingSystemCode.Exd),
                AmountAdc = x.Where(y => y.BillingSystemCode == BillingSystemCode.Adc).Sum(y => y.PaymentAmount),
                AmountNotAdc = x.Where(y => y.BillingSystemCode == BillingSystemCode.Exd).Sum(y => y.PaymentAmount),
                UniqueFileCount = x.Select(y => x.Key.FileId).Distinct().Count()
            });

        return CreateSummaryListModel(result);
    }

输入实体:

    public class RemittanceCenterSummaryListModel
{

    public RemittanceCenterSummaryListModel()
    {
        this.RemittanceBatchSummaryRecord = new List<RemittanceBatchProcessingModel>();
    }

    public List<RemittanceBatchProcessingModel> RemittanceBatchSummaryRecord { get; private set; }
}

 public class RemittanceCenterBatchSummarizedModel
{
    public string FileId { get; set; }
    public string SourceFileName { get; set; }
    public string BatchCode { get; set; }
    public string BatchType { get; set; }
    public int DetailRecordCountAdc { get; set; }
    public int DetailRecordCountNotAdc { get; set; }
    public int DetailRecordCountTotal { get; set; }
    public decimal AmountAdc { get; set; }
    public decimal AmountNotAdc { get; set; }
    public decimal AmountTotal { get; set; }
    public BillingSystemCode BillingSystemCode { get; set; }
    public int UniqueFileCount { get; set; }
}

    private static RemittanceCenterBatchSummaryListModel CreateSummaryListModel(IEnumerable<RemittanceCenterBatchSummarizedModel> summaryModels)
    {
        var summaryModelList = new RemittanceCenterBatchSummaryListModel();

        foreach (var summaryRec in summaryModels)
        {
            var summaryModel = new RemittanceCenterBatchSummarizedModel
            {
                FileId = summaryRec.FileId,
                SourceFileName = summaryRec.SourceFileName,
                BatchCode = summaryRec.BatchCode,
                BatchType = summaryRec.BatchType,
                DetailRecordCountAdc = summaryRec.DetailRecordCountAdc,
                DetailRecordCountNotAdc = summaryRec.DetailRecordCountNotAdc,
                AmountAdc = summaryRec.AmountAdc,
                AmountNotAdc = summaryRec.AmountNotAdc,
                UniqueFileCount = summaryRec.UniqueFileCount
            };

            summaryModelList.RemittanceBatchSummary.Add(summaryModel);
        }

        return summaryModelList;
    }

示例输入记录:

记录1:

   FileId: '123'
   SourceFileName: 'test.file.txt'
   BatchCode: 'aaa'
   BatchType: 'scanned'
   PaymentAmount: '50.00'
   BillingSystemCode: 'Adc'

记录1:

   FileId: '1234'
   SourceFileName: 'test.file2.txt'
   BatchCode: 'aab'
   BatchType: 'scanned'
   PaymentAmount: '52.00'
   BillingSystemCode: 'Adc'

UniqueFileCount的ActualOuput字段:

    UniqueFileCount = 1

UniqueFileCount字段的ExpectedOutput结果:

    UniqueFileCount = 2

我做错了什么?

1 个答案:

答案 0 :(得分:1)

听起来您希望整个集合的FileId明确计数,而不仅仅是每个组,由于FileId是您分组的字段之一,因此总是为1。如果是这种情况,那么您可以先计算该计数

int distinctFileIds = remittanceCenterSummaryListModel.RemittanceBatchSummaryRecor‌​d
    .Select(x => x.FileId)
    .Distinct()
    .Count();

然后在Linq查询中使用它

UniqueFileCount = distinctFileIds