C# 使用Where和GroupBY将sql转换为linq
SQL: 我试过LINQ:C# 使用Where和GroupBY将sql转换为linq,c#,sql,linq,C#,Sql,Linq,SQL: 我试过LINQ: SELECT p.PipelineID , MAX(PipelineJobStatus.CreatedTimeStamp) , Client.ClientName , FCO.NameFCO , p.ProjectValueHr , p.ProjectValueMoney , p.CommentPipeline , PipelineJobStatus.CreatedTimeSTamp , p.ModifiedTimeStamp , Employee.Name ,
SELECT
p.PipelineID
, MAX(PipelineJobStatus.CreatedTimeStamp)
, Client.ClientName
, FCO.NameFCO
, p.ProjectValueHr
, p.ProjectValueMoney
, p.CommentPipeline
, PipelineJobStatus.CreatedTimeSTamp
, p.ModifiedTimeStamp
, Employee.Name
, Employee.Surname
, JobStatus.JobStatusName
FROM (Pipeline p
LEFT OUTER JOIN PipelineJobStatus ON p.PipelineID = PipelineJobStatus.PipelineID)
INNER JOIN JobStatus ON (PipelineJobStatus.JobStatusID = JobStatus.JobStatusID)
LEFT OUTER JOIN Client ON (p.ClientID = Client.ClientID)
LEFT OUTER JOIN FCO ON (p.FCOID = FCO.FCOID)
LEFT OUTER JOIN Employee ON (p.CreatedBy = Employee.EmployeeD)
WHERE PipelineJobStatus.CreatedTimeStamp IN
(SELECT MAX(CreatedTimeStamp) FROM PipelineJobStatus GROUP BY PipelineID)
GROUP BY p.PipelineID
, Client.ClientName
, FCO.NameFCO
, p.ProjectValueHr
, p.ProjectValueMoney
, p.CommentPipeline
, PipelineJobStatus.CreatedTimeSTamp
, p.ModifiedTimeStamp
, Employee.Name
, Employee.Surname
, JobStatus.JobStatusName
.Where()
子句用红色下划线
我错在哪里
SQL正在运行
我将改变这个链表,使用连接,现在我只想工作
也许存储过程在这里并不是一个糟糕的选择。只是想一想——也许在数据库中为此创建存储过程或视图更容易些?我打赌它会更高效,更容易被其他开发人员理解。因为这样的linq查询无法维护。您可以从EF或Linq调用SP到SQL。为什么要使用Linq?SQL总是faster@Viru可能会更新一个旧项目,使用Entity Framework删除带有测试和托管代码的潜在易出错代码,以便将SQL行转换为C#对象。它增加了可测试性并缩短了开发时间。代码中的SQL总是比可以重构的对象更难维护,也更难保护。我不确定我是否同意SQL总是更快这一事实。您必须维护自己的数据阅读器等。。在性能方面,SQL更快,但是的,我同意,如果你考虑代码维护和可测试性,那么EF要好得多……只是想,在数据库中创建存储过程或视图更容易吗?我打赌它会更高效,更容易被其他开发人员理解。因为这样的linq查询无法维护。您可以从EF或Linq调用SP到SQL。为什么要使用Linq?SQL总是faster@Viru可能会更新一个旧项目,使用Entity Framework删除带有测试和托管代码的潜在易出错代码,以便将SQL行转换为C#对象。它增加了可测试性并缩短了开发时间。代码中的SQL总是比可以重构的对象更难维护,也更难保护。我不确定我是否同意SQL总是更快这一事实。您必须维护自己的数据阅读器等。。在性能方面,SQL更快,但是的,我同意,如果你考虑代码维护和可测试性,那么EF要好得多。
from pjs in db.PipelineJobStatus
//.OrderByDescending(p=>p.CreatedTimeStamp)
//.DistinctBy(p => p.PipelineID)
//.FirstOrDefault()
from pipe in db.Pipelines
.Where(pipe => pipe.PipelineID == pjs.PipelineID).DefaultIfEmpty()
from status in db.JobStatus
.Where(statuses => statuses.JobStatusID == pjs.JobStatusID)
.DefaultIfEmpty()
from fco in db.FCOes
.Where(fcoes => fcoes.FCOID == pipe.FCOID)
from client in db.Clients
.Where(clients => clients.ClientID == pipe.ClientID)
//Where PipelineJobStatus.CreatedTimeStamp in (select max(CreatedTimeStamp) from PipelineJobStatus group by PipelineID)
.Where(pjs.CreatedTimeStamp in select Max(pjs.CreatedTimeStamp)from PipelineJobStatus group by)
group by { pipe.PipelineID } //group new
by new
{
status.JobStatusName,
pipe.PipelineID,
pipe.ClientID,
client.ClientName,
fco.NameFCO,
fco.FCOID,
pipe.Employee.Name,
pipe.Employee.Surname,
pipe.CommentPipeline,
pipe.CreatedBy,
pipe.CreatedTimeStamp,
pipe.ModifiedTimeStamp,
pipe.ProjectValueHr,
pipe.ProjectValueMoney
} into g
orderby g.Key.PipelineID descending
select new StatusPipelineMerge
{
PipelineID = g.Key.PipelineID,
ProjectValueHr = g.Key.ProjectValueHr,
ProjectValueMoney = g.Key.ProjectValueMoney,
CommentPipeline = g.Key.CommentPipeline,
ClientName = g.Key.ClientName,
FCOName = g.Key.NameFCO,
FCOID = g.Key.FCOID,
ClientID = g.Key.ClientID,
CreatedTimeStamp = g.Key.CreatedTimeStamp,
ModifiedTimeStamp = g.Key.ModifiedTimeStamp,
CreatedBy = g.Key.CreatedBy,
//CreatedNameSurname = g.Key.Employee.Name + " " + g.Key.Employee.Surname
JobStatusName = g.Key.JobStatusName
}