2013-01-11 17 views
0

我這裏有一個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; } 
} 
+2

你有在具有匹配QueueID但嘗試你的Q和R表的記錄一片空白?另外,你可以請你的課程發佈Q和R嗎? – IronMan84

+0

請檢查更新後的問題。我已經發布了這些課程。此外,在嘗試爲NULL的情況下也沒有記錄。 –

回答

1

如果你得到的結果數,表示這個問題是在參加十次。我建議從下往上構建查詢並測試結果以確定加入是否存在問題。

請先嚐試:

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) => new { ResultID = r.ResultID, QueueID = q.QueueID 
    ); 

foreach (var result in query) 
{ 
    // See what you have got 
} 

也許會更容易,甚至先做其中:

IQueryable<PracticeSummary> query = db.Results 
    .Where(
     r => r.CampaignID == 1 
      && r.PickUp.Value.Month == lastMonth 
      && r.PickUp.Value.Year == lastMonthYear 
    ) 
    .Join(
     db.Queues, 
     r => new { Id = r.QueueID.Value, Attempt = r.Attempt.Value }, 
     q => new { Id = q.QueueID, Attempt = (byte)q.Attempt }, 
     (r, q) => new { ResultID = r.ResultID, QueueID = q.QueueID 
    ); 

foreach (var result in query) 
{ 
    // See what you have got 
} 
+0

Got it!我的查詢不一樣。關鍵在於我的查詢條件。我的LINQ查詢是正確的,並且SQL是錯誤的。我正在查詢最近幾個月的記錄。 所以在LINQ我猜中了: '&& r.PickUp.Value.Month == lastMonth && r.PickUp.Value.Year == lastMonthYear' 但在我的SQL查詢我: '和DATEPART (m,R.Pickup)= DATEPART(m,DATEADD(m,-1,getdate())) AND DATEPART(y,R拾取)= DATEPART(Y,DATEADD(米,-1,GETDATE()))' 對於DATEPART ** **Ý是**一年中的天**和** ** YY裝置** **一年。是的,這是我的錯誤。你的自下而上的方法幫助了我,所以我將你標記爲答案。謝謝! –

0

有沒有可能是你的Results.Attempt和Queue.Attempt值包含一些空?

如果是下面的語句將成倍增加在搜索結果中所有空行:

OR (([Results].[Attempt] IS NULL) AND (CAST([Queue].[Attempt] AS tinyint) IS NULL)) 
+2

在「隊列」和「結果」表中,沒有任何記錄具有「嘗試」空值。 –

+0

另一件事,它做與你查詢不同的是它使用CAST([Queue]。[Attempt] AS tinyint))而不是[Queue]。[Attempt],但如果Attempt是int,則不會影響任何東西。 – Bulat

相關問題