LINQ 与 SQL Server 2000 的不兼容问题

发布于 2024-07-11 05:44:37 字数 3893 浏览 3 评论 0原文

我有一个 Linq to SQL 查询,它在 SQL Server 2005 上工作得很好,但是,我必须使用 SQL Server 2000 来部署 Web 应用程序,并且在执行该查询时,我收到错误:

“System.Data.SqlClient.SqlException :列前缀“t0”与查询中使用的表名或别名不匹配。”

我还有更多疑问,但似乎没有问题。 现在,这是查询:

from warningNotices in DBContext_Analyze.FARs
where warningNotices.FAR_Area_ID == filter.WarningAreaID &&
      warningNotices.FAR_Seq == filter.WarningSeq &&
      warningNotices.FAR_Year == filter.WarningYear
      orderby warningNotices.FAR_Seq ascending
      select new Search_Result
      {
        FAR_Area_ID = warningNotices.FAR_Area_ID,
        FAR_Seq = warningNotices.FAR_Seq,
        FAR_Year = warningNotices.FAR_Year,
        DateTime_Entered = (DateTime)warningNotices.DateTime_Entered == null ?   DateTime.MaxValue : (DateTime)warningNotices.DateTime_Entered,
        Time_Entered = warningNotices.Time_Entered,
        OrigDept = warningNotices.OrigDept,
        Part_No = warningNotices.Part_No,
        DateTime_Analyzed = (DateTime)warningNotices.DateTime_Analyzed == null ? DateTime.MaxValue : (DateTime)warningNotices.DateTime_Analyzed,
        Analyzed_By = warningNotices.Analyzed_By,
        MDR_Required = (Char)warningNotices.MDR_Required == null ? Char.MinValue : (Char)warningNotices.MDR_Required,
        Resp_Dept = (from FARSympt in DBContext_Analyze.FAR_Symptoms
                     where FARSympt.FAR_Area_ID == warningNotices.FAR_Area_ID &&
                   FARSympt.FAR_Year == warningNotices.FAR_Year &&
                   FARSympt.FAR_Seq == warningNotices.FAR_Seq
                 select new { FARSympt.Resp_Dept}).FirstOrDefault().Resp_Dept,
        Sympt_Desc = (from SymptomsCatalog in DBContext_Analyze.Symptoms
              where SymptomsCatalog.symptom_ID == filter.Status_ID
                  select new { 
                                       SymptomsCatalog.Sympt_Desc
                                     }).FirstOrDefault().Sympt_Desc,
        Status_ID = warningNotices.Status.HasValue ? warningNotices.Status.Value : 0
        };

以前,我在 Resp_Dept 字段的子查询中有一个“Distinc”,但我删除了它。

有任何想法吗? 预先感谢您的评论 =)


这是我从 SQL Server 探查器获得的查询:

exec sp_executesql N'SELECT [t0].[FAR_Seq], [t0].[FAR_Year], 
    (CASE 
        WHEN ([t0].[DateTime_Entered]) IS NULL THEN @p3
        ELSE [t0].[DateTime_Entered]
     END) AS [DateTime_Entered], [t0].[Time_Entered], [t0].[OrigDept], [t0].[Part_No], 
    (CASE 
        WHEN ([t0].[DateTime_Analyzed]) IS NULL THEN @p4
        ELSE [t0].[DateTime_Analyzed]
     END) AS [DateTime_Analyzed], [t0].[Analyzed_By], 
    (CASE 
        WHEN (UNICODE([t0].[MDR_Required])) IS NULL THEN @p5
        ELSE CONVERT(NChar(1),[t0].[MDR_Required])
     END) AS [MDR_Required], (
    SELECT [t2].[Resp_Dept]
    FROM (
        **SELECT TOP (1)** [t1].[Resp_Dept]
        FROM [dbo].[FAR_Symptoms] AS [t1]
        WHERE (UNICODE([t1].[FAR_Area_ID]) = UNICODE([t0].[FAR_Area_ID])) AND ([t1].[FAR_Year] = [t0].[FAR_Year]) AND ([t1].[FAR_Seq] 
= [t0].[FAR_Seq])
        ) AS [t2]
    ) AS [Resp_Dept], (
    SELECT [t4].[Sympt_Desc]
    FROM (
        **SELECT TOP (1)** [t3].[Sympt_Desc]
        FROM [dbo].[Symptoms] AS [t3]
        WHERE [t3].[symptom_ID] = @p6
        ) AS [t4]
    ) AS [Sympt_Desc], [t0].[FAR_Area_ID], 
    (CASE 
        WHEN [t0].[Status] IS NOT NULL THEN [t0].[Status]
        ELSE @p7
     END) AS [Status_ID]
FROM [dbo].[FARs] AS [t0]
WHERE (UNICODE([t0].[FAR_Area_ID]) = @p0) AND ([t0].[FAR_Seq] = @p1) AND ([t0].[FAR_Year] = @p2)
ORDER BY [t0].[FAR_Seq]',N'@p0 int,@p1 int,@p2 varchar(2),@p3 datetime,@p4 datetime,@p5 nchar(1),@p6 int,@p7 
int',@p0=76,@p1=7204,@p2='08',@p3=''9999-12-31 23:59:59:997'',@p4=''9999-12-31 23:59:59:997'',@p5=N' ',@p6=0,@p7=0

我认为 SQL Server 2000 中可能没有的唯一想法是“选择顶部...”中的“()”,但我不确定这是否是导致问题的原因,而且我也不知道如何解决这个问题 =S

再次感谢 =)

I have a Linq to SQL query that was working just fine with SQL Server 2005 but, I have to deploy the web app with a SQL Server 2000 and, when executing that query, I get his error:

"System.Data.SqlClient.SqlException: The column prefix 't0' does not match with a table name or alias name used in the query."

I have more queries but it doesn't seems to have problems with those.
Now, this is the query:

from warningNotices in DBContext_Analyze.FARs
where warningNotices.FAR_Area_ID == filter.WarningAreaID &&
      warningNotices.FAR_Seq == filter.WarningSeq &&
      warningNotices.FAR_Year == filter.WarningYear
      orderby warningNotices.FAR_Seq ascending
      select new Search_Result
      {
        FAR_Area_ID = warningNotices.FAR_Area_ID,
        FAR_Seq = warningNotices.FAR_Seq,
        FAR_Year = warningNotices.FAR_Year,
        DateTime_Entered = (DateTime)warningNotices.DateTime_Entered == null ?   DateTime.MaxValue : (DateTime)warningNotices.DateTime_Entered,
        Time_Entered = warningNotices.Time_Entered,
        OrigDept = warningNotices.OrigDept,
        Part_No = warningNotices.Part_No,
        DateTime_Analyzed = (DateTime)warningNotices.DateTime_Analyzed == null ? DateTime.MaxValue : (DateTime)warningNotices.DateTime_Analyzed,
        Analyzed_By = warningNotices.Analyzed_By,
        MDR_Required = (Char)warningNotices.MDR_Required == null ? Char.MinValue : (Char)warningNotices.MDR_Required,
        Resp_Dept = (from FARSympt in DBContext_Analyze.FAR_Symptoms
                     where FARSympt.FAR_Area_ID == warningNotices.FAR_Area_ID &&
                   FARSympt.FAR_Year == warningNotices.FAR_Year &&
                   FARSympt.FAR_Seq == warningNotices.FAR_Seq
                 select new { FARSympt.Resp_Dept}).FirstOrDefault().Resp_Dept,
        Sympt_Desc = (from SymptomsCatalog in DBContext_Analyze.Symptoms
              where SymptomsCatalog.symptom_ID == filter.Status_ID
                  select new { 
                                       SymptomsCatalog.Sympt_Desc
                                     }).FirstOrDefault().Sympt_Desc,
        Status_ID = warningNotices.Status.HasValue ? warningNotices.Status.Value : 0
        };

Previously I had a "Distinc" in the subquery for the Resp_Dept field, but I removed it.

Any ideas? Thanks in advance for your comments =)


This is query I get from the SQL Server profiler:

exec sp_executesql N'SELECT [t0].[FAR_Seq], [t0].[FAR_Year], 
    (CASE 
        WHEN ([t0].[DateTime_Entered]) IS NULL THEN @p3
        ELSE [t0].[DateTime_Entered]
     END) AS [DateTime_Entered], [t0].[Time_Entered], [t0].[OrigDept], [t0].[Part_No], 
    (CASE 
        WHEN ([t0].[DateTime_Analyzed]) IS NULL THEN @p4
        ELSE [t0].[DateTime_Analyzed]
     END) AS [DateTime_Analyzed], [t0].[Analyzed_By], 
    (CASE 
        WHEN (UNICODE([t0].[MDR_Required])) IS NULL THEN @p5
        ELSE CONVERT(NChar(1),[t0].[MDR_Required])
     END) AS [MDR_Required], (
    SELECT [t2].[Resp_Dept]
    FROM (
        **SELECT TOP (1)** [t1].[Resp_Dept]
        FROM [dbo].[FAR_Symptoms] AS [t1]
        WHERE (UNICODE([t1].[FAR_Area_ID]) = UNICODE([t0].[FAR_Area_ID])) AND ([t1].[FAR_Year] = [t0].[FAR_Year]) AND ([t1].[FAR_Seq] 
= [t0].[FAR_Seq])
        ) AS [t2]
    ) AS [Resp_Dept], (
    SELECT [t4].[Sympt_Desc]
    FROM (
        **SELECT TOP (1)** [t3].[Sympt_Desc]
        FROM [dbo].[Symptoms] AS [t3]
        WHERE [t3].[symptom_ID] = @p6
        ) AS [t4]
    ) AS [Sympt_Desc], [t0].[FAR_Area_ID], 
    (CASE 
        WHEN [t0].[Status] IS NOT NULL THEN [t0].[Status]
        ELSE @p7
     END) AS [Status_ID]
FROM [dbo].[FARs] AS [t0]
WHERE (UNICODE([t0].[FAR_Area_ID]) = @p0) AND ([t0].[FAR_Seq] = @p1) AND ([t0].[FAR_Year] = @p2)
ORDER BY [t0].[FAR_Seq]',N'@p0 int,@p1 int,@p2 varchar(2),@p3 datetime,@p4 datetime,@p5 nchar(1),@p6 int,@p7 
int',@p0=76,@p1=7204,@p2='08',@p3=''9999-12-31 23:59:59:997'',@p4=''9999-12-31 23:59:59:997'',@p5=N' ',@p6=0,@p7=0

The only think that I see there that may not in SQL Server 2000 is the '()' in the "Select top..." but I'm not sure if that is what is causing the problem and, also, I don't know how that could be fixed =S

Thanks again =)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

二手情话 2024-07-18 05:44:37

我的 Linq 语句在 SQL2008 上有效,但在 SQL2000 上出现完全相同的错误消息。
有一个非常相似的 Linq 查询对两者都有效,唯一真正的区别是在调用 .ToList() 之前我调用了 .OrderBy() 子句。
前任:
var query = 来自表 1 中的 t1 ...
...;

list = query.OrderBy(o => o.Field).ToList()

在损坏的 Linq 查询上尝试了相同的 OrderBy 子句,它成功了!

一定是bug吗?

My Linq statement worked on SQL2008 but broke with the exact same error message on SQL2000.
Had a very similar Linq query that worked on both, the only real difference was that before calling .ToList() I called the .OrderBy() clause.
Ex:
var query = from t1 in table1 ...
...;

list = query.OrderBy(o => o.Field).ToList()

Tried the same OrderBy clause on the broken Linq query and it worked!

Has to be a bug?

人生百味 2024-07-18 05:44:37

您是否有 Visual Studio 和框架的最新 Service Pack?

我刚刚检查了一些 Linq 生成的 SQL,它正在针对 SQL Server 2000 数据库正确使用“Top 1”。

Do you have the latest Service Pack for Visual Studio and the framework?

I just checked some of my Linq generated SQL and it is using "Top 1" correctly against a SQL Server 2000 database.

三人与歌 2024-07-18 05:44:37

经过多次测试和审查数据库后,我发现问题出在我正在处理的旧表上:该表具有“文本”类型字段。 另外,我必须删除嵌套查询中的一些“不同”指令。

我发现这个,经过审查,我发现我有更改我的查询,并且“不同”指令无法正常工作。 作为旁注,我要说的是,嵌套查询也可能会产生意外的行为。

因此,这里真正的教训是,如果您需要针对 SQL Server 2000 部署,请设置服务器实例并对其进行测试! XD

非常感谢你的帮助 =)

after several testing and review the DB, I found that the problem was a legacy table I was working on: that table has "text" type fields. Also, I had to remove some "Distinct" instructions in a nested query I had.

I found this and, after review that, I found that I have to change my queries and that the "Distinct" instruction does not work correctly. As a side note, let me say that the nested queries can also generate unexpected behavior.

So, the real lesson here is that if you need to deploy this against a SQL Server 2000, set an instance of the server and test against it!!! XD

Thanks a lot of your help =)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文