C# 试图在Lambda LinQ中重写SQL
我正在将一些SQL脚本迁移到Lambda中,但我还不知道如何转换此SQLC# 试图在Lambda LinQ中重写SQL,c#,sql-server,linq,lambda,C#,Sql Server,Linq,Lambda,我正在将一些SQL脚本迁移到Lambda中,但我还不知道如何转换此SQL SELECT COUNT([ProcessID]) AS [Count], [ProcessType], AVG(DATEDIFF(s, [StartDate], [EndDate])) AS [AverageDuration] FROM [ProcessTable] WHERE [InstanceID] = @InstanceID AND [ProcessType] = @
SELECT
COUNT([ProcessID]) AS [Count],
[ProcessType],
AVG(DATEDIFF(s, [StartDate], [EndDate])) AS [AverageDuration]
FROM
[ProcessTable]
WHERE
[InstanceID] = @InstanceID
AND [ProcessType] = @ProcessType
AND [ProcessStatus] = 3 -- Finished
GROUP BY
[ProcessType]
编辑:我尝试了以下方法,但它并不完全理解平均值是如何工作的
var result = (from p in ctx.ProcessTable
where p.ProcessInstanceID.Equals(processInstanceID)
&& p.ProcessType.Equals(processType)
&& p.ProcesoStatusEquals(ProcessStatusEnum.FINISHED)
group p by p.ProcessType into tp
select new
{
Count = tp.Count(tp.ProcessID),
AverageDuration = tp.Average(p => p.EndDate - p.StarDate)
ProcesType = tp.ProcesType
});
任何帮助都将不胜感激。。事先谢谢经过几次尝试,我明白了。如果有人感兴趣,我会回答自己
class ProcessResult
{
public int Count { get; set; }
public double AverageDuration { get; set; }
public string ProcessType { get; set; }
}
var result = (from p in ctx.ProcessTable
where p.ProcessInstanceID.Equals(processInstanceID)
&& p.ProcessType.Equals(processType)
&& p.ProcesoStatusEquals(ProcessStatusEnum.FINISHED)
group p by p.ProcessType into tp
select new ProcessResult
{
Count = tp.Count(),
AverageDuration = tp.Average(p => DbFunctions.DiffSeconds(p.StartDate, p.EndDate)),
ProcessType = tp.Key
}).SingleOrDefault();
用我的最新尝试编辑…为什么不将原始查询实现到存储库中,而不是使用实体框架?这是一项要求。出于某种原因,他们不希望在项目中使用任何Sql,只希望使用EF。原始查询位于存储过程中,该存储过程在项目的早期版本中运行良好。请尝试:p.EndDate.Date-p.StarDate.Date。SQL脚本使用了整天,而转换使用了一天的部分时间。谢谢@jdweng,但我最终在差异中使用了TotalSeconds。请参阅下面的回复。