2008-11-06 53 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

相关问题