我有一个LINQ查询,它将根据是否满足一些条件来选择故障单。查询本身运行正常并且运行正常,但我担心随着可能的回报数量的增加,它会随着它的变化而显着变差。
有人可以建议改进或优化此查询以更快/更好地运行的方法吗?我是否对标准做法做了可怕的错误?
这是查询。我换了一些名字。我认为select
语句中的select new
也是一个问题。
var attentionObj = (from c in context.SupportTicketEntities
where
c.StatusID != 3 &&
((c.IsAllocated == false) // not allocated
|| (c.FlaggedForAssist == true && c.AllocatedToEmployeeID == empId) // is flagged for assist
|| ((from d in c.SupportTicketDatas
where c.AllocatedToEmployeeID == empId
&& c.FogBugzAttachments.Count == 0
orderby d.TimeStamp descending
select d.TimeStamp).FirstOrDefault() < warningDt) // ticket not replied to
|| ((from e in c.SupportTicketDatas
where c.AllocatedToEmployeeID == empId
orderby e.TimeStamp descending
select e).FirstOrDefault().RaisedByUser == true) // customer has replied
|| (c.IsEscalated == true)) // ticket escalated
select new
{
RefID = c.RefID,
TicketID = c.SupportTicketID,
ClientCompany = c.ClientData.Company,
IsAllocated = c.IsAllocated,
DateLogged = c.DateLogged,
IsFlagged = c.FlaggedForAssist,
NeedsReply = (from d in c.SupportTicketDatas
orderby d.TimeStamp descending
select d.TimeStamp).FirstOrDefault() < warningDt,
CustReply = (from e in c.SupportTicketDatas
orderby e.TimeStamp descending
select e).FirstOrDefault().RaisedByUser == true,
IsEscalated = c.IsEscalated
}).ToArray();
编辑:所以我已经创建了一个存储过程,尽管我并不是最好的SQL。这没关系吗?
@empId int,
@warningDt datetime
AS
SELECT * FROM SupportTickets
WHERE StatusID != 3
AND IsAllocated = 0
UNION
SELECT * FROM SupportTickets
WHERE StatusID != 3
AND FlaggedForAssist = 1
AND AllocatedToEmployeeID = @empId
UNION
SELECT * FROM SupportTickets
WHERE StatusID != 3
AND AllocatedToEmployeeID = @empId
AND NOT EXISTS (SELECT FogBugzLinkID FROM FogBugzAttachment)
AND (SELECT MAX(TimeStamp)
FROM SupportTicketData
WHERE SupportTickets.SupportTicketID = SupportTicketData.SupportTicketID) < @warningDt
UNION
SELECT SupportTickets.* FROM SupportTickets
JOIN SupportTicketData ON SupportTickets.SupportTicketID = SupportTicketData.SupportTicketID
WHERE SupportTickets.StatusID != 3
AND SupportTickets.AllocatedToEmployeeID = @empId
AND SupportTicketData.TimeStamp = (SELECT MAX(TimeStamp) FROM SupportTicketData
WHERE SupportTickets.SupportTicketID = SupportTicketData.SupportTicketID)
AND SupportTicketData.RaisedByUser = 1
UNION
SELECT * FROM SupportTickets
WHERE StatusID != 3
AND SupportTickets.IsEscalated = 1
答案 0 :(得分:0)
所以看起来像使用我的初始语句中的存储过程比使用可怕的LINQ OR语句更有效。
我将此标记为答案,以便关闭。看看我对SPROC的原始问题。