繁体   English   中英

LINQ 单次查询子组结果

[英]LINQ Sub group results with a single query

我的 model 代表一个国家的计数如下

public class GeoStatsModel
{
    public int Id { get; set; } // Country Id
    public string Name { get; set; }  //Country Name
    public int Count { get; set; }
} 

一些示例结果如下所示

List<GeoStatsModel> response;

14 UNITED STATES : 6668
23 CANADA : 768
3 MEXICO : 83
4 PUERTO RICO : 19
35 ISRAEL : 1
46 ECUADOR : 1
57 GERMANY : 3
68 NETHERLANDS : 2
9 COSTA RICA : 1

我们可以用 2 个 id 的结果从这个列表中进一步过滤吗

14 UNITED STATES : 6668
23 CANADA : 768
0  Others : [ Sum of Count from all other conuntries] 

国家 ID 14 和 23 的值是不变的,不会改变

我可以将所有其他国家的总和作为

List<int> knownCountries = new List<int> { 14, 13 };
int sum_others = response.Where(g => !knownCountries.Contains(g.Id)).Select(g=>g.Count).Sum();

同样我可以找到

 int sum_US=.
 int sum_Canada=..

但是我们可以用任何方式将其编写为 linq 查询以将结果组合在单个 go 中

我建议使用命名元组来处理IdNameCount

List<GeoStatsModel> response =

...

var result = response
  .Select(item => (
     id    : knownCountries.Contains(item.Id) ? item.Id : 0,
     name  : knownCountries.Contains(item.Id) ? item.Name : "Others",
     value : item.Count
   ))
  .GroupBy(item => (id : item.id, name : item.name), 
           item => item.value)
  .Select(group => (
     id    : group.Key.id,
     name  : group.Key.name,
     count : group.Sum()
   ));

让我们看看result

string report = string.Join(Environment.NewLine, result
  .Select(item => $"{item.id} {item.name} : {item.count}")
);

Console.Write(report);

我使用元组(int id, string name, int count)作为最终结果,但也可以返回GeoStatsModel

  ...

  .Select(group => new GeoStatsModel() {
     Id    = group.Key.id,
     Name  = group.Key.name,
     Count = group.Sum()
   });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM