求助:将C# Lambda查询转换为简化版SQL Server存储过程
将C# Lambda查询转换为简洁的SQL Server存储过程
需求说明
从ResultData表中筛选符合以下条件的记录:
TrackingIdentifier等于指定编号,或关联的IntakeData表的Requestor_CaseID等于该编号ResponseType为'RESPONSE'Status为'OK'Destination为指定值
按CreatedDate倒序取第一条,返回字段包括:ResultStatus、Destination及关联的IntakeData全量数据。
原C# Lambda代码
string[] Includes = new string[] { "IntakeData" }; var r = _repo.Filter<ResultData> (a => (a.TrackingIdentifier == trackingNum || a.IntakeData.Requestor_CaseID == trackingNum) && a.ResponseType == "RESPONSE" && a.Status == "OK" && a.Destination == rs, Includes) .OrderByDescending(d => d.CreatedDate) .Select(c => new { c.ResultStatus, c.Destination, c.IntakeData }) .FirstOrDefault();
简化后的SQL Server存储过程
EF自动生成的SQL包含大量冗余空值检查,以下是简化后的存储过程:
CREATE PROCEDURE GetLatestResultData @TrackingNum VARCHAR(255), @Destination VARCHAR(255) AS BEGIN SET NOCOUNT ON; SELECT TOP 1 rd.ResultStatus, rd.Destination, id.ID, id.TrackingIdentifier, id.ClientTrackingIdentifier, id.RequestorEmail, id.CandidateEmail, id.ConsumerIdentifier, id.LocationIdentifier, id.CandidateID, id.TotalCount, id.KitIdentifier, id.QueryStatus, id.QueryData, id.CreatedDate, id.CorporateEntityID, id.Requestor_CaseID, id.CandidateSMS, id.NotificationType, id.REDTAILOrderCreationStatus, id.REDTAILOrderCreationErrorMessage, id.APIInviteData, id.CRN FROM dbo.ResultData rd LEFT JOIN dbo.IntakeData id ON rd.IntakeDataID = id.ID WHERE (rd.TrackingIdentifier = @TrackingNum OR id.Requestor_CaseID = @TrackingNum) AND rd.ResponseType = 'RESPONSE' AND rd.Status = 'OK' AND rd.Destination = @Destination ORDER BY rd.CreatedDate DESC; END
简化说明
- 移除EF生成的多层嵌套查询,直接用
LEFT JOIN关联两张表,逻辑更直观 - 删除冗余空值检查:若业务中参数和对应字段不会为
NULL,直接使用等值判断即可;如需兼容NULL场景,可补充(字段 IS NULL AND 参数 IS NULL)的分支,但多数业务场景下无需该冗余逻辑 - 精简返回字段,仅保留需求明确的内容,避免不必要的投影
- 调整参数类型长度(将自动生成的
VARCHAR(8000)改为更合理的VARCHAR(255),可根据实际业务调整)
内容的提问来源于stack exchange,提问作者Unconquered82
相关产品推荐
相关产品推荐

