Проблема несовместимости LINQ с SQL Server 2000 - PullRequest
0 голосов
/ 16 января 2009

У меня есть запрос 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
        };

Ранее в подзапросе для поля 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

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

Ответы [ 3 ]

1 голос
/ 24 марта 2011

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

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

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

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

0 голосов
/ 19 января 2009

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

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

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

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

0 голосов
/ 16 января 2009

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

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

...