Проблема несовместимости LINQ с SQL Server 2000

У меня есть запрос Linq to SQL, который отлично работал с SQL Server 2005, но мне нужно развернуть веб-приложение с SQL Server 2000, и при выполнении этого запроса я получаю его ошибку:

«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
        };

Раньше у меня было "Distinc" в подзапросе для поля Resp_Dept, но я его удалил.

Любые идеи? Заранее спасибо за комментарии =)


Это запрос, который я получаю от профилировщика 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

Еще раз спасибо =)


person Community    schedule 16.01.2009    source источник
comment
Включите вход в систему и опубликуйте выполняемую команду SQL. Похоже на баг, но надо посмотреть...   -  person Jon Skeet    schedule 16.01.2009


Ответы (3)


Мой оператор Linq работал на SQL2008, но сломался с точно таким же сообщением об ошибке на SQL2000. Был очень похожий запрос Linq, который работал на обоих, единственная реальная разница заключалась в том, что перед вызовом .ToList() я вызывал предложение .OrderBy(). Пример: var query = from t1 in table1 ... ...;

список = запрос.OrderBy(o => o.Field).ToList()

Попробовал то же предложение OrderBy для неработающего запроса Linq, и это сработало!

Должен быть баг?

person Coenraad Myburgh    schedule 24.03.2011

У вас есть последний пакет обновления для Visual Studio и платформы?

Я только что проверил некоторые из моих сгенерированных Linq SQL, и он правильно использует «Top 1» по сравнению с базой данных SQL Server 2000.

person TGnat    schedule 16.01.2009
comment
Я дважды проверил сгенерированный запрос, и да, вершина сгенерирована без кавычек. Теперь, что еще не так? Я также проверил другие запросы, и они без проблем используют префикс «t0» =( - person ; 16.01.2009
comment
Другое дело: на сервере у нас нет SP1 для .Net Framework 3.5, так что я попробую его обновить. - person ; 16.01.2009

после нескольких тестов и проверки БД я обнаружил, что проблема заключалась в устаревшей таблице, над которой я работал: в этой таблице есть поля текстового типа. Кроме того, мне пришлось удалить некоторые инструкции "Отдельные" во вложенном запросе, который у меня был.

Я нашел это и после просмотра обнаружил, что у меня есть изменить мои запросы и что инструкция "Отличная" работает некорректно. В качестве примечания позвольте мне сказать, что вложенные запросы также могут генерировать неожиданное поведение.

Итак, настоящий урок заключается в том, что если вам нужно развернуть это на SQL Server 2000, установите экземпляр сервера и протестируйте его!!! XD

Большое спасибо за помощь =)

person Community    schedule 19.01.2009
comment
Для справки, есть и другие известные отличия - например, нетривиальное пейджинг полностью не проходит из-за отсутствия ROW_NUMBER. Насколько я знаю, он официально не поддерживается в 2000 году, даже если некоторые простые вещи работают. - person Marc Gravell; 19.01.2009