带有 groupby 和聚合的 LINQ 始终显示默认值

LINQ with groupby and aggregate always shows default value

我有 2 个模型对象,DriverDetailsSourceObject 用于保存 DriverDetailsAPI 响应,DriverDetailsView 用于在网页上显示具有聚合值的 DriverDetails 详细信息。

public class DriverDetailsSourceObject
{
    public string Name { get; set; }
    public string GroupName { get; set; }
    public DateTime DateOfPurchase { get; set; }
}

public class DriverDetailsView
{
    public string Name { get; set; }
    public string GroupName { get; set; }
    public DateTime DateOfPurchase { get; set; }
    public int Count { get; set; } = 1;

    public DriverDetailsView(DriverDetailsSourceObject source)
    {
        Name = source.Name;
        GroupName = source.GroupName;
        DateOfPurchase = source.DateOfPurchase;
    }
}

DriverDetailsView 用于多个页面。其中 2 个显示 NameGroupNameDateOfPurchaseCount,其中 Count 始终为 1,ToTalCount 将是 [=13= 的数量] 集合中的对象。

Name Count Group Name Date
RoadAssistance A 1 Group A 1/1/2022
RoadAssistance A 1 Group B 2/1/2022
RoadAssistance A 1 Group A 2/2/2022
RoadAssistance B 1 Group A 2/2/2022
Total 4

在其中一个页面中,我们需要显示所有按名称分组的对象并计算计数和组名列表。我使用了以下 LINQ 表达式。

private IEnumerable<DriverDetailsSourceObject> DriverDetails { get; set; } = Enumerable.Empty<DriverDetailsSourceObject>();
private IEnumerable<DriverDetailsView> DriverDetailsByOption { get; set; } = Enumerable.Empty<DriverDetailsView>();
.
.
DriverDetails = DriverService.GetDriverOptions(brandName, isAgentLoggedIn);

DriverDetailsByOption = DriverDetails.GroupBy(o => o.Name)
    .Select(d => 
        new DriverDetailsSourceObject()
        { 
            Name = d.First().Name,
            GroupName = d.First().GroupName,
            Count = d.Count()
        })
    .Select(v => new DriverDetailsView(v));

我使用上面的 LINQ 没有得到正确的结果。即使按 Name 分组后,Count 始终为 1。可能是因为 CountDriverDetailsView 中有一个默认值 1,我不能更改它,因为它被其他页面使用。

Name Count Group Name
RoadAssistance A 1 Group A
RoadAssistance B 1 Group A
Total 2

预期结果如下:

Name Count Group Name
RoadAssistance A 3 Group A, Group B
RoadAssistance B 1 Group A
Total 4

如何更改我的 LINQ 表达式以获得此结果?

问题 1: 由于您没有在 DriverDetailsView 的构造函数中初始化 Count,因此 Count 将是 1默认为初始化。

同时,您提到 DriverDetailsSourceObject 即您的 API 响应 class 没有 Count 属性.

第 2 期:

在您的 LINQ 语句中,您 return 第一个 GroupName 而不是多个 GroupName:

GroupName = d.First().GroupName

解决方案

第 1 期: 我建议使用空构造函数而不是 DriverDetailsView(DriverDetailsSourceObject source) 构造函数。

public class DriverDetailsView
{
    ...

    public DriverDetailsView() { }
    
    ...
}

第 2 期:

要return多个GroupName,需要select和不同的GroupName,接下来用String.Join()加入GroupName数组作为字符串。

如下更改 LINQ 语句:

DriverDetailsByOption = DriverDetails.GroupBy(o => o.Name)
    .Select(d => new DriverDetailsView
    { 
        Name = d.Key,
        GroupName = String.Join(",", d.Select(x => x.GroupName).Distinct()),
        Count = d.Count()
    });

Sample program

如你.GroupBy()姓名,这一行

Name = d.First().Name

可以替换为:

Name = d.Key