C# 使用linq group by计算统计信息

C# 使用linq group by计算统计信息,c#,entity-framework,linq,C#,Entity Framework,Linq,我试图计算如下统计数据: Id StateName 1 Failed 2 Succeeded 成功:10 失败:10 以下是我的表格: public partial class MyProgress { public int Id { get; set; } public int JobId { get; set; } public int TestPartId { get; set; }

我试图计算如下统计数据:

Id       StateName
1        Failed
2        Succeeded
成功:10

失败:10

以下是我的表格:

public partial class MyProgress
    {
        public int Id { get; set; }
        public int JobId { get; set; }
        public int TestPartId { get; set; }
        public virtual TestPart TestPart { get; set; }
    }

    public partial class Job
    {
        public int Id { get; set; }
        public string StateName { get; set; }
    }
作业表包含如下记录:

Id       StateName
1        Failed
2        Succeeded
这就是我试图计算静力学的方法:

var query = from p in context.MyProgress
             join job in context.Jobs on p.TestPartId equals job.Id
             where p.TestPart.Test.RegionId == 100
             group p by new
             {
                   p.TestPartId
             } into g
             select new
             {
                    succeeded = g.Sum(e => g.First(). ? 1 : 0),     
             }).FirstOrDefault();
但在上面的查询中,在计算Successed和Failed stats时,我无法获取StateName属性,因为我无法在group by的一部分中进行选择


有人能帮我吗?

您可以使用“分组依据”对感兴趣的结果进行分组,然后计算(一)组中的每种类型:

你也可以从另一个角度考虑,找到你感兴趣的
工作
s,但你仍然需要一组人来计算:

var ans2 = from j in Jobs
           where (from p in MyProgress
                  where p.TestPart.RegionId == 100
                  select p.TestPartId).Contains(j.Id)
           group j by 1 into jg
           select new {
               Succeeded = jg.Count(j => j.StateName == "Succeeded"),
               Failed = jg.Count(j => j.StateName == "Failed")
           };
注意:如果您可以获得包含每个状态和计数的表,则可以改为在
StateName
上分组:

var ans3 = from p in MyProgress
           where p.TestPart.RegionId == 100
           join j in Jobs on p.TestPartId equals j.Id
           group j by j.StateName into jg
           select new {
               StateName = jg.Key,
               Count = jg.Count()
           };

您是否只想要失败和成功的数量?或者您还需要其他信息吗?@maccettura只需要失败和成功的DownVoter的数量。请至少注意评论此问题中缺少的内容,以便我在发布下一个问题时记住。谢谢:)
分组方式创建新对象。改为使用p.TestPartId:
按p.TestPartId分组p
此外,如果您仅将成功和失败作为状态,则可能改为使用布尔值
HasSucceeded
。或者枚举也可以工作。为什么
TestPartId
匹配
job.Id
而不是
JobId
?为什么您需要参考
MyProgress
来计算
作业的总统计数据
?非常感谢您对我的帮助。感谢:)