C# 将多分区按转换为LINQ
EF Core还没有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
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>();
}
}