C# 将多分区按转换为LINQ

C# 将多分区按转换为LINQ,c#,entity-framework,linq,C#,Entity Framework,Linq,EF Core还没有SqlQuery()方法(epic fail),因此我无法在数据库上运行查询/存储过程来获取“摘要”数据。下面是我需要转换为LINQ的多个分区BY的摘要查询: SELECT s.Name, SUM(CASE WHEN pc.WorkflowStateId <> 99 THEN 1 ELSE 0 END) OVER (PARTITION BY s.SiteId) 'RegisteredCount', SUM(CA

EF Core还没有
SqlQuery()
方法(epic fail),因此我无法在数据库上运行查询/存储过程来获取“摘要”数据。下面是我需要转换为LINQ的多个分区BY的摘要查询:

SELECT 
    s.Name,
    SUM(CASE WHEN pc.WorkflowStateId <> 99 THEN 1 ELSE 0 END) 
        OVER (PARTITION BY s.SiteId) 'RegisteredCount',     
    SUM(CASE WHEN pc.WorkflowStateId = 99 THEN 1 ELSE 0 END) 
        OVER (PARTITION BY s.SiteId) 'ScreenFailedCount'
FROM Sites s 
JOIN Patients p ON p.SiteId = s.SiteId 
JOIN PatientCycles pc ON pc.PatientId = p.PatientId

Linq的另一种选择是:

var query= from s in context.Sites
           join p in context.Patiens on s.SiteId equals p.SiteId
           join pc in context.PatientCycles on p.PatiendId equals p.PatiendId 
           group pc.WorkflowStateId by new{s.SiteId,s.Name} into g
           select new {Name=g.Key.Name,
                       RegisteredCount=g.Sum(e=>e!=99?1:0),
                       ScreenFailedCount=g.Sum(e=>e==99?1:0)
                      }
更新 要避免这种问题,请使用nav。特性:

var query= from s in context.Sites
           select t new SiteSummary
            {
                SiteId = s.SiteId,
                Name = s.Name,
                Code = s.Code,
                RegisteredCount =s.Patiens.SelectMany(e=>e.PatientCycles.Select(y=>y.WorkflowStateId ))
                                          .Sum(x => x!= WorkflowStateType.Terminated ? 1 : 0),
                ScreenFailedCount = s.Patiens.SelectMany(e=>e.PatientCycles.Select(y=>y.WorkflowStateId ))
                                             .Sum(x => x== WorkflowStateType.Terminated ? 1 : 0)
            };
我还建议在实体构造函数中初始化集合导航属性:

public class Sites
{
  //...
  public virtual ICollection<Patient> Patients{get;set;}
  public Sites()
  { 
    Patients=new List<Patient>();
  }
}
公共类站点
{
//...
公共虚拟ICollection患者{get;set;}
公共场所()
{ 
患者=新列表();
}
}

我刚刚意识到这只会返回有患者周期的站点。如果没有patients/patientcycles,我如何更改此查询以返回站点(计数为0)。在这种情况下,我认为您需要执行左连接而不是内部连接,请检查此项以了解如何执行。无法对包含聚合或子查询的表达式执行聚合函数
public class Sites
{
  //...
  public virtual ICollection<Patient> Patients{get;set;}
  public Sites()
  { 
    Patients=new List<Patient>();
  }
}