2012-05-23 27 views
0

我有兩個表父和子。這兩個表都有一個主鍵「MyDate」,在Sql Server中聲明爲DateTime。這兩個表都有一個記錄,其中MyDate設置爲「2011-12-01 00:00:00.000」,即2011年12月1日。Linq To Sql關聯使用英國數據庫登錄的DateTime屬性

在我的Linq to SQL dbml(.Net 3.5)中,我有一個自動創建的關聯在兩個表之間,在MyDate屬性上。 DataContext使用SQL Server(2008)中默認語言設置爲「英式英語」的數據庫登錄。當我運行Linq查詢時:

var query 
    from parent in myDataContext.PARENTs 
    select parent 

我找回了父記錄,但沒有鏈接的子記錄。

在SQL事件探查器我有這樣的痕跡:

-- network protocol: TCP/IP 
set quoted_identifier on 
set arithabort off 
set numeric_roundabort off 
set ansi_warnings on 
set ansi_padding on 
set ansi_nulls on 
set concat_null_yields_null on 
set cursor_close_on_commit off 
set implicit_transactions off 
set language British 
set dateformat dmy 
set datefirst 1 
set transaction isolation level read committed 
exec sp_executesql N'SELECT [t0].[MyDate] FROM [dbo].[CHILD] AS [t0] 
WHERE ([t0].[MYDATE] = @p0)','@p0 datetime',@p0='2011-12-01 00:00:00' 

這將返回0記錄;我通過在查詢窗口中直接運行它來檢查它,使用相同的(英國)登錄。如果我註釋掉「set dateformat dmy」,我仍然會得到0條記錄。如果我使用不是英國的登錄名運行它,我會得到一個記錄。如果我使用'01 -12-2011 00:00:00'作爲日期(例如英國日期格式)和英國登錄名,我會得到一個記錄。

在我看來,Linq在創建查詢中使用的日期字符串時沒有使用正確的日期格式。因爲它使用「set dateformat dmy」,爲什麼它不會在它生成的日期字符串中使用該格式?

是否有一個相對簡單的方法來解決這個問題?謝謝。

編輯:在我的模型中,Parent和Child的MyDate屬性具有「DateTime NOT NULL」的服務器數據類型和「DateTime(System.DateTime)」類型。

+1

#IN您的LINQ模型,是吧'DateTime'?或某種類型的字符串?同樣,在C#生成的代碼中。基本上,它應該**不會**將日期作爲字符串傳遞。如果你這樣做,你做錯了什麼。它應該始終是一個類型化的參數,因此文化是無關緊要的。我懷疑你所看到的@ p0的價值僅僅是一個*表示*,而且發送的值實際上是一個二進制浮點數,它在每種文化中都是同一日期。 –

+0

是的,它是我的模型中的DateTime。 – Polyfun

回答

0

嘗試預先加載

LINQ to SQL: Lazy and Eager Loading Hiccups

var query = (from parent in MyDataContext.Parents select parent) 
       .Including(childs => parent.Childs); 

嘗試

from parent in Parents select new 
    {parent.Name, parent.Whatever, 
    Childs = 
     parent.Childs.where(c=>c.Date== parent.Date) }; 
+0

錯誤..你的意思是'=='儀式? – V4Vendetta

+0

@ V4Vendetta - yes ............. –

+0

我沒有包括可用;根據你的鏈接它被微軟殺死;-( – Polyfun