.net - LinqToSql 在不同机器上为相同代码生成不同的 Sql 查询

标签 .net asp.net sql linq-to-sql

我有一个使用 Asp.net 和 LinqToSql 构建的用于数据访问的网站。在站点的某个部分,LinqToSql 生成一个如下所示的查询(来自我的开发机器):

select ...
from table1
left outer join table2 on table1 where ...
left outer join table3 on table2 where ...

由于 table2 和 table1 之间的连接并不总是存在,因此左外连接适用于这种情况。并且由于table3和table1之间的链接要经过table2,所以还需要一个左外连接。此 sql 返回正确的记录集。

我只是把代码放到服务器上。在同一场景中运行相同的代码,LinqToSql 生成以下查询:
select ...
from table1
left outer join table2 on table1 where ...
join table3 on table2 where ...

出于某种原因,它将 table2 和 table3 之间的连接呈现为内部连接,而不是外部连接。这会导致查询返回零记录。

开发机器和服务器都使用 .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};

在上述描述的上下文中,table1 = Import_Table,table2 = 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] 

在开发机器上,最后一行以“左外”开头。在服务器上,最后一行以“Inner”开头

更新:我的解决方案是 below

最佳答案

您的生产数据库是否与您的开发数据库不同,例如SQL Server 2008 而不是 2005?我相信 LINQ to SQL 会根据它与之对话的实际执行时数据库来改变它生成的 SQL。

另外,两个数据库上的模式是否完全相同?

关于.net - LinqToSql 在不同机器上为相同代码生成不同的 Sql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/269594/

相关文章:

.net - 创建仅 jquery/.NET 服务的网站是否可能或有意义?

asp.net - IIS 不使用 SSL 证书

c# - 处理输入验证的专业/首选方式是什么

java - SQL 连接与 Java 代码?

.net - 当单元测试调试停止时,Moles 崩溃

c# - 检查 Get-NetTCPConnection 对象是否存在

javascript - 如何将 .NET URL 正则表达式转换为 Javascript URL 正则表达式?

asp.net - 运行 IIS Express 时 ASP.NET 网站的程序集在哪里

asp.net - 单个站点上的多个应用程序 - session 和表单例份验证范围

SQL/配置单元 : How to calculate days to purchase