开发者社区> 问答> 正文

LinqToSql在不同的机器上为相同的代码产生不同的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 ... 由于某种原因,它将表2和表3之间的联接呈现为内部联接,而不是外部联接。这将导致查询返回零记录。

开发机器和服务器都使用.Net 3.5 SP1。开发人员机器是Vista64,服务器是Windows Server 2003 SP2。我的一位使用Windows XP PRO的同事也确认了他们在dev机器上的正确行为。

谁能想到服务器创建其他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,表3 = 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”开头

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-18 16:17:59 549 0
1 条回答
写回答
取消 提交回答
  • 您的生产数据库是否与开发数据库不同,例如SQL Server 2008而不是2005?我相信LINQ to SQL会根据正在与之交谈的实际执行时间数据库来改变它生成的SQL。

    此外,两个数据库上的架构是否完全相同?

    2019-11-18 16:18:23
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server在电子商务中的应用与实践 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载