带有 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 个显示 Name
、GroupName
、DateOfPurchase
和 Count
,其中 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。可能是因为 Count
在 DriverDetailsView
中有一个默认值 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()
});
如你.GroupBy()
姓名,这一行
Name = d.First().Name
可以替换为:
Name = d.Key
我有 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 个显示 Name
、GroupName
、DateOfPurchase
和 Count
,其中 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。可能是因为 Count
在 DriverDetailsView
中有一个默认值 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()
});
如你.GroupBy()
姓名,这一行
Name = d.First().Name
可以替换为:
Name = d.Key