我這裏有一個SQL查詢,看起來像這樣:以下查詢有什麼區別?一種是直線上升的SQL,另一種是等額LINQ
SELECT R.Extra3 AS 'Practice',
SUM(DATEDIFF(s, R.Pickup, R.Hangup)) AS 'Seconds',
COUNT(R.Extra3) AS 'Calls'
FROM Outbound.dbo.Results R
JOIN Outbound.dbo.Queue Q
ON Q.QueueID = R.QueueID
AND Q.Attempt = R.Attempt
WHERE R.CampaignId = 1
AND DATEPART(m, R.Pickup) = DATEPART(m, DATEADD(m, -1, getdate()))
AND DATEPART(y, R.Pickup) = DATEPART(y, DATEADD(m, -1, getdate()))
GROUP BY R.Extra3
我有一個程序來使用這個,決定去的LINQ路線。因此,這裏是我想出了:
IQueryable<PracticeSummary> query = db.Results
.Join(
db.Queues,
r => new { Id = r.QueueID.Value, Attempt = r.Attempt.Value },
q => new { Id = q.QueueID, Attempt = (byte)q.Attempt },
(r, q) => r
)
.Where(
r => r.CampaignID == 1
&& r.PickUp.Value.Month == lastMonth
&& r.PickUp.Value.Year == lastMonthYear
)
.GroupBy(g => g.Extra3)
.Select(r => new PracticeSummary
{
Practice = r.Key,
Calls = r.Count(),
Seconds = (r.Sum(item => EntityFunctions.DiffSeconds(item.PickUp, item.HangUp).Value))
});
我的SQL查詢是給我正確的結果,而我的LINQ查詢返回的10倍以上的行,結果,和與計數較多。
我甚至看着生成的TSQL。它看起來像這樣:
SELECT
1 AS [C1],
[GroupBy1].[K1] AS [Extra3],
[GroupBy1].[A1] AS [C2],
[GroupBy1].[A2] AS [C3]
FROM (SELECT
[Filter1].[K1] AS [K1],
COUNT([Filter1].[A1]) AS [A1],
SUM([Filter1].[A2]) AS [A2]
FROM (SELECT
[Extent1].[Extra3] AS [K1],
1 AS [A1],
DATEDIFF (second, [Extent1].[PickUp], [Extent1].[HangUp]) AS [A2]
FROM [dbo].[Results] AS [Extent1]
INNER JOIN [dbo].[Queue] AS [Extent2] ON ([Extent1].[QueueID] = [Extent2].[QueueID]) AND (([Extent1].[Attempt] = CAST([Extent2].[Attempt] AS tinyint)) OR (([Extent1].[Attempt] IS NULL) AND (CAST([Extent2].[Attempt] AS tinyint) IS NULL)))
WHERE (1 = [Extent1].[CampaignID]) AND ((DATEPART (month, [Extent1].[PickUp])) = @p__linq__0) AND ((DATEPART (year, [Extent1].[PickUp])) = @p__linq__1)
) AS [Filter1]
GROUP BY [K1]
) AS [GroupBy1]
據我可以告訴它是非常相似,我有和想要的。
所以我的問題是爲什麼結果不同?我的SQL和LINQ查詢有什麼區別?我錯過了什麼?
在此先感謝您的時間和精力!
編輯:
下面是隊列&結果類:
public partial class Queue
{
public long QueueID { get; set; }
public long CampaignID { get; set; }
public int Attempt { get; set; }
public System.DateTime StartTime { get; set; }
public System.DateTime EndTime { get; set; }
public string Extra1 { get; set; }
public string Extra2 { get; set; }
public string Extra3 { get; set; }
}
public partial class Result
{
public long ResultID { get; set; }
public Nullable<long> QueueID { get; set; }
public Nullable<long> CampaignID { get; set; }
public Nullable<byte> Attempt { get; set; }
public Nullable<System.DateTime> PickUp { get; set; }
public Nullable<System.DateTime> HangUp { get; set; }
public string Extra1 { get; set; }
public string Extra2 { get; set; }
public string Extra3 { get; set; }
}
你有在具有匹配QueueID但嘗試你的Q和R表的記錄一片空白?另外,你可以請你的課程發佈Q和R嗎? – IronMan84
請檢查更新後的問題。我已經發布了這些課程。此外,在嘗試爲NULL的情況下也沒有記錄。 –