2008-11-06 50 views
4

我有一個使用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

+0

你可以包含你的Linq代碼嗎? – Keltex 2008-11-06 17:51:07

回答

-1

我已經檢查了以下內容:

  1. 都使用同一個數據庫
  2. 雙方都有相同的代碼
  3. 雙方都有相同的dbml文件

我知道的東西有在某個地方不同步,但我找不到它。

所以我實現了以下解決方法:我添加了一個視圖到我的數據庫,其中包括兩個左外連接。這個視圖現在在我的dbml文件中,並且在上面的查詢中,我引用了視圖而不是表格。這工作正常。

0

聽起來像兩者之間的LINQ to SQL類(DBML和/或相關代碼生成)是不相同 - 具體如何定義這兩個表之間的關聯。

+0

我想到了這一點,並確保再次複製dbml文件,以防萬一它們不同步。沒有幫助。完全相同的DBML文件。 – 2008-11-06 19:20:25

2

您的生產數據庫與您的開發數據庫不同嗎? SQL Server 2008而不是2005?我相信LINQ to SQL會根據它所談論的實際執行時間數據庫來改變它生成的SQL。

此外,兩個數據庫上的模式是否完全相同?

+0

他們都使用相同的數據庫。 – 2008-11-06 20:47:39

+0

因此,除非有兩個版本的.net 3.5 SP1可以使用,我可以告訴的唯一區別是主機環境:在安裝了VS 2008 + 3.5 SP1的Vita或XP上,它適用於Windows Server 2003與.Net 3.5 SP1安裝它不。 – 2008-11-06 20:53:50

相關問題