2009-12-02 125 views
0

我現在徹底沮喪。我遇到了LINQ-To-SQL的問題。大約80%的時間,它工作的很好,我喜歡它。另外20%的時間,L2S創建的查詢返回正確的數據,但實際從代碼運行時,它不會返回任何內容。我即將把我的頭髮拉出來。我希望有人能看到一個問題或以前聽說過這個。谷歌搜索沒有什麼回報。C# - Linq-To-SQL - 查詢問題

這裏是LINQ查詢...

var query = from e in DataLayerGlobals.GetInstance().db.MILLERTIMECARDs 
     where e.deleted_by == -1 
     && e.LNAME == lastName 
     && e.FNAME == firstName 
     && e.TIMECARDDATE == startDate.ToString("MM/dd/yyyy") 
     group e by e.LNAME into g 
     select new EmployeeHours 
     { 
      ContractHours = g.Sum(e => e.HRSCONTRACT), 
      MillerHours = g.Sum(e => e.HRSSHOWRAIN + e.HRSOTHER), 
      TravelHours = g.Sum(e => e.HRSTRAVEL) 
     }; 

這是生成的查詢....

SELECT SUM([t0].[HRSCONTRACT]) AS [ContractHours], 
     SUM([t0].[HRSSHOWRAIN] + [t0].[HRSOTHER]) AS [MillerHours], 
     SUM([t0].[HRSTRAVEL]) AS [TravelHours] 
FROM [dbo].[MILLERTIMECARD] AS [t0] 
WHERE ([t0].[deleted_by] = @p0) 
    AND ([t0].[LNAME] = @p1) 
    AND ([t0].[FNAME] = @p2) 
    AND ([t0].[TIMECARDDATE] = @p3) 
GROUP BY [t0].[LNAME] 

現在,當我插上了完全相同的值的LINQ查詢使用進入生成的查詢,我得到正確的數據。當我讓代碼運行時,我什麼也得不到。

任何想法?

回答

1

什麼類型是TIMECARDDATE?日期,日期時間,datetime2,smalldatetime,datetimeoffset或字符?

任何機會的本地日期/時間設置搞亂startDate.ToString(...)的日期比較?由於您要發送@ p3作爲字符串,01/02/2009可能意味着2月1日 1月2日,具體取決於服務器上的日期/時間設置。

+0

TIMECARDDATE是一個字符串。是的,是的,我知道。我繼承了這個數據庫,並且改變它不是一個選項。 這可能是問題。它在日期爲2009年10月19日時有效,但在日期爲2009年5月10日時不起作用。這是SQL Server問題還是LINQ問題? – 2009-12-02 03:12:28

+1

@ Eclipsed4utoo你對10/5/2009的失敗以及db日期只是字符串的事實的評論讓我認爲你的格式字符串應該是「MM/d/yyyy」,而不是你的「10/5/2009 「而不是」10/05/2009「作爲你當前的代碼。 – imaginaryboy 2009-12-02 03:31:49

+0

老兄......你太棒了。就是這樣。我結束了使用「M/D/YYYY」,所以月份不會有領先的0,這似乎也導致了這個問題。 – 2009-12-02 03:49:23

1

我的直覺告訴我,你需要將DataLayerGlobals.GetInstance().db.MILLERTIMECARDs變成IQueryable變量,然後執行你的Linq查詢,儘管實際上應該沒有什麼區別(除了可讀性更好之外)。

在運行Linq查詢之前,您可以先檢查IQueryable變量的結果。

爲了進一步擴展這個概念,您可以創建一系列IQueryable變量,每個變量都存儲使用原始查詢中每個單獨條件的Linq查詢的結果。這樣,你應該能夠隔離失敗的情況。

1

我還會看看FNAME數據類型的LNAME &。如果它們是NCHAR/NVARCHAR,則可能需要修改記錄,例如

var query = from e in DataLayerGlobals.GetInstance().db.MILLERTIMECARDs 
    where e.deleted_by == -1 
    && e.LNAME.Trim() == lastName 
    && e.FNAME.Trim() == firstName 
    && e.TIMECARDDATE == startDate.ToString("MM/dd/yyyy") 
    group e by e.LNAME into g 
    select new EmployeeHours 
    { 
     ContractHours = g.Sum(e => e.HRSCONTRACT), 
     MillerHours = g.Sum(e => e.HRSSHOWRAIN + e.HRSOTHER), 
     TravelHours = g.Sum(e => e.HRSTRAVEL) 
    };