2013-06-06 31 views
3

我在LINQPad中鍵入以下LINQ,並使用dbcontext連接到我的數據庫(SQL Server 2005)。LINQPad - 無法理解生成的查詢

from j in Jobs 
where j.dValuationDate.HasValue && j.dValuationDate.Value > EntityFunctions.AddDays(DateTime.Now, -7).Value && 
j.dValuationDate.Value < EntityFunctions.AddHours(DateTime.Now, -1).Value && 
j.bXMLServiceProviderID.HasValue && j.bXMLServiceProviderID.Value == 1 && 
!ValuationDelays.Any(x => x.iJobID == j.iJobID && x.iStatusID == 5) 
select j.iJobID 

作業和評估延遲是由iJobId列鏈接的數據庫中的表。

通過LINQPad生成的SQL是:

SELECT 
[Extent1].[iDelayID] AS [iDelayID], 
[Extent1].[iJobID] AS [iJobID], 
[Extent1].[sReasonforDelay] AS [sReasonforDelay], 
[Extent1].[dDateTime] AS [dDateTime], 
[Extent1].[iStaffID] AS [iStaffID], 
[Extent1].[iStatusID] AS [iStatusID], 
[Extent1].[dSentDate] AS [dSentDate], 
[Extent1].[yValExDelayReasonID] AS [yValExDelayReasonID], 
[Extent1].[dDelayedUntilDate] AS [dDelayedUntilDate], 
[Extent1].[dValuationDate] AS [dValuationDate], 
[Extent1].[valexActionUpdateId] AS [valexActionUpdateId], 
[Extent1].[valexAppointmentReasonId] AS [valexAppointmentReasonId] 
FROM [dbo].[ValuationDelays] AS [Extent1] 

注意沒有where子句。我不明白爲什麼LINQPad會產生這樣的查詢。我究竟做錯了什麼?

查詢,當我在2010年VS

+1

select語句(在SQL中)全部搞砸了。它應該只選擇'iJobID' ... –

+0

opun進一步檢查,這兩個語句根本不匹配。選擇是錯誤的,並且'From'不是同一張桌子!嘗試再次運行您的Linq查詢,並確保它更新SQL結果 –

回答

3

你在!j.ValuationDelays代替了!ValuationDelays調試運行正常,並返回在C#代碼預期結果。

看起來像這樣會導致EF從數據庫加載所有ValuationDelay,並處理內存中的整個語句。我無法解釋爲什麼沒有查詢Job記錄中的謂詞,但至少現在你有一些東西需要糾正。

+0

ValuationDelays不是作業表的一部分。它就像工作一樣是一張單獨的桌子。 我在這裏要做的是寫一個不EXISTS子句。 _italic_not EXISTS(從valuationdelays中選擇1,其中iJobID = j.iJobID和iStatusID = 5)_italic_ – Pradeep

+0

對不起,我看到你在這裏說的。我不應該直接引用「ValuationDelays」,而應該通過作業外鍵(j.ValuationDelays)來引用它。我會檢查並接受答案或答覆。 – Pradeep

+0

好吧,它的工作方式。我現在也不需要x.iJobId == j.iJobId。 縮短的版本是: '從j在工作 其中j.dValuationDate.HasValue && j.dValuationDate.Value> EntityFunctions.AddDays(DateTime.Now,-7)。價值&& j.dValuationDate.Value x.iStatusID == 5) select j。 iJobID' – Pradeep