考虑出现0,将两个参数分组并计入linq

时间:2017-02-28 12:16:15

标签: c# linq count group-by

我有一个IQueriable<EntityA>类型的对象objA,我想使用lambda表示法在c#中进行查询,按两个参数(Status和WeekOfYear)进行分组,并计算EntityA类型中每个实体的出现次数。 objA。我希望结果集的计数为0.

IQueriable<EntityA> objA= ...

var group = objA.GroupBy(a => new { a.Status, a.WeekOfYear })
                .Select(a => new { a.Key.Status, a.Key.Week, Count = a.Count() });

上面的代码是我从我想要的最接近的代码。它返回IQueriable<int, int, int>,我可以轻松地将其插入到我的excel表中。但是当计数为0时,我在结果集中没有进入,然后填写Excel表格变得棘手。是否有可能获得我需要的结果,或者我是否真的需要检查所有对(这么不优雅!!!)?

1 个答案:

答案 0 :(得分:0)

如果您使用Distinct()功能, 您可以获取所有状态和所有WeekOfYear并检查每个元组的计数。

代码就像这样,你可以在fiddle

中获得一个有效的演示
using System;   
using System.Linq;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        IQueryable<Entity> data = (new List<Entity>() {
            new Entity { Status = "1", Week = "a"},
                new Entity { Status = "2", Week = "c"},
                new Entity { Status = "3", Week = "b"},
                new Entity { Status = "1", Week = "a"},
                new Entity { Status = "1", Week = "a"}  
        }) .AsQueryable();;



        var result = new List<EntityResult>();

        var statuses = data.Select(a => a.Status).Distinct().ToList();
        var weeks = data.Select(a => a.Week).Distinct().ToList();

        statuses.ForEach(s => {
            weeks.ForEach( w => {
                int count = data.Where(a => a.Status == s && a.Week == w).Count();

                result.Add(new EntityResult { Status = s, Week = s, Count= count});
            });
        });


        Console.WriteLine(result[0].Count);
    }



}

public class Entity 
{
    public string Status;

    public string Week;
}

public class EntityResult
{

    public string Status;

    public string Week;

    public int Count;
}