我有一個使用Asp.net和LinqToSql進行數據訪問的網站。在站點的某些部分,LinqToSql產生一個查詢,看起來像這樣(從我的dev的機器):LinqToSql在不同的計算機上爲相同的代碼生成不同的Sql查詢
select ...
from table1
left outer join table2 on table1 where ...
left outer join table3 on table2 where ...
由於表2和表1之間的連接並不總是存在的,左外連接在這個適當的情況。而且由於table3和table1之間的鏈接通過table2,它也需要一個左外連接。這個sql返回正確的記錄集。
我只是把代碼放到服務器上。在相同的情況下運行的相同的代碼,LinqToSql產生以下查詢:
select ...
from table1
left outer join table2 on table1 where ...
join table3 on table2 where ...
出於某種原因,它呈現爲一個內連接表2表3和之間的連接,而不是外部聯接。這會導致查詢返回零個記錄。
開發機器和服務器都使用.Net 3.5 SP1。開發機器是Vista64,服務器是Windows Server 2003 SP2。我的一位使用Windows XP PRO的同事也在他們的開發機器上確認了同樣的正確行爲。
任何人都可以想到爲什麼服務器會創建不同的SQL的原因?我怎樣才能解決這個問題?這似乎與LINQ和.Net在服務器上運行的方式有關。但是,我想不出有什麼辦法來確認和解決這個問題。
LINQ的代碼(我只包括相關的,其中SQL改變部的部分):
from Import_Table t in db.Import_Tables
select new {
CheckedOutUser = (!t.IsCheckedOut) ? "--" : t.Import_CheckoutHistory.System_User.FirstName + " " + t.Import_CheckoutHistory.System_User.LastName,
CheckedOutUserID = (!t.IsCheckedOut) ? 0 : t.Import_CheckoutHistory.System_UserID};
在上面的描述的上下文中,表1 = Import_Table,表2 = Import_CheckoutHistory ,table3 = System_User。如果我在這裏註釋掉以「CheckedOutUser = ...」開頭的行,那麼它在服務器上運行 - 所以這絕對是罪魁禍首。
實際的SQL返回:
SELECT
(CASE WHEN NOT ([t0].[IsCheckedOut] = 1) THEN CONVERT(NVarChar(401),'--') ELSE ([t2].[FirstName] + ' ') + [t2].[LastName] END) AS [CheckedOutUser],
(CASE WHEN NOT ([t0].[IsCheckedOut] = 1) THEN 0 ELSE [t1].[system_UserID] END) AS [CheckedOutUserID]
FROM [dbo].[import_Table] AS [t0]
LEFT OUTER JOIN [dbo].[import_CheckoutHistory] AS [t1] ON [t1].[import_CheckoutHistoryID] = [t0].[import_CheckoutHistoryID]
LEFT OUTER/INNER JOIN [dbo].[system_User] AS [t2] ON [t2].[system_UserID] = [t1].[system_UserID]
在開發機器,最後一行開始 「左外」。在服務器上,最後一行開頭「內」
更新:我的解決方案是below
你可以包含你的Linq代碼嗎? – Keltex 2008-11-06 17:51:07