EF: текстовый тип данных не может быть выбран как отличный, поскольку он несопоставим

#sql-server #string #linq-to-sql

#sql-server #строка #linq-to-sql

Вопрос:

Я получаю эту ошибку, потому что у меня есть таблица SQL Server со столбцом типа «текст».

 The text data type cannot be selected as DISTINCT because it is not comparable
  

Есть ли способ решить эту проблему без изменения типа данных?

Вот мой оператор linq (он длинный):

                 var query = (from s in db.tblSuppliers
                             join p in
                                 (
                                    from p1 in db.tblSupplierPricingSchemes
                                    select new
                                    {
                                        p1.SupplierID,
                                        p1.PSLangPairID,
                                        p1.CustomerID,
                                        p1.PSLanguageStatus,
                                        p1.PSPriceBasis,
                                        p1.PSMinFlatCharge,
                                        p1.PSTrxPrf,
                                        p1.PSNoMatch,
                                        p1.PSFuzzy,
                                        p1.PS100Match_Rep,
                                        p1.PSTrxOnly,
                                        p1.PSPrfOnly,
                                        p1.PSLinquisticHourlyRate,
                                        p1.PSDTPType,
                                        p1.PSDTPRate,
                                        p1.PS_FZ50,
                                        p1.PS_FZ75,
                                        p1.PS_FZ85,
                                        p1.PS_FZ95,
                                        p1.PS_FZ100,
                                        p1.PS_FZREPS,
                                        p1.PSPerfectMatch
                                    }
                                 ) on s.SupplierID equals p.SupplierID
                             join p2 in
                                 (
                                        from p in db.tblSupplierPricingSchemes
                                        where custID.Contains(p.CustomerID) amp;amp; p.PSLangPairID == languagePairID
                                        group p by new { p.SupplierID, p.PSLangPairID, p.PSPriceBasis } into g
                                        let CustomerID = g.Max(uh => uh.CustomerID)
                                        select new
                                        {
                                            g.Key.SupplierID,
                                            g.Key.PSLangPairID,
                                            g.Key.PSPriceBasis,
                                            CustomerID
                                        }
                                 ) on p.SupplierID equals p2.SupplierID
                             join b in db.tblPricingBasis on p.PSPriceBasis equals b.PricingBasisID
                             join ss in db.tblSupplierStatus on p.PSLanguageStatus equals ss.SupplierStatusID into g1
                             from ss in g1.DefaultIfEmpty()
                             join l in db.tblLangPairs on p.PSLangPairID equals l.ProductID
                             where l.ProductID == languagePairID
                                amp;amp; p.PSLangPairID == p2.PSLangPairID
                                amp;amp; p.CustomerID == p2.CustomerID
                                amp;amp; p.PSPriceBasis == p2.PSPriceBasis
                             select new PreferredSupplier
                             {
                                 SupplierID = s.SupplierID,
                                 //SupplierName = s.CompanyName != null ? s.CompanyName   "-"   s.SupplierFirstName   " "   s.SupplierLastName
                                 //                                     : s.SupplierFirstName   " "   s.SupplierLastName,

                                 SupplierName = s.CompanyName != null
                                            ? s.SupplierFirstName != null || s.SupplierLastName != null
                                                    ? s.CompanyName   "-"   s.SupplierFirstName   " "   s.SupplierLastName
                                                    : s.CompanyName
                                            : s.SupplierFirstName   " "   s.SupplierLastName,

                                 CompanyName = s.CompanyName,
                                 SupplierFirstName = s.SupplierFirstName,
                                 SupplierLastName = s.SupplierLastName,

                                 SupplierStatus = p.CustomerID == customerID ? "Team Member" : ss.SupplierStatus,
                                 Email = (string)s.SupplierEmails,

                                 Rate = (s.VolumeDiscountType == 1 ? // Percentage
                                     //if the volume discount is as percentage then get the rate and multiple it by 1 - the discount percentage
                                        ((words > s.VolumeDiscountAmount amp;amp; (task == "TM No Match" || task == "Translation/Proofreading")) ? 1 - s.VolumeDiscountValue : 1) *
                                                    (
                                                        rateField == "PSTrxPrf" ? p.PSTrxPrf :
                                                        rateField == "PSNoMatch" ? p.PSNoMatch :
                                                        rateField == "PSFuzzy" ? p.PSFuzzy :
                                                        rateField == "PS100Match_Rep" ? p.PS100Match_Rep :
                                                        rateField == "PSLinquisticHourlyRate" ? p.PSLinquisticHourlyRate :
                                                        rateField == "PSDTPRate" ? p.PSDTPRate :
                                                        rateField == "PS_FZ50" ? p.PS_FZ50 :
                                                        rateField == "PS_FZ75" ? p.PS_FZ75 :
                                                        rateField == "PS_FZ85" ? p.PS_FZ85 :
                                                        rateField == "PS_FZ95" ? p.PS_FZ95 :
                                                        rateField == "PS_FZ100" ? p.PS_FZ100 :
                                                        rateField == "PS_FZREPS" ? p.PS_FZREPS :
                                                        rateField == "PSPerfectMatch" ? p.PSPerfectMatch : null
                                                    ) :
                                     // Discount in Amount
                                     // Take the Rate and substract the amount to discount
                                                   (
                                                        rateField == "PSTrxPrf" ? p.PSTrxPrf :
                                                        rateField == "PSNoMatch" ? p.PSNoMatch :
                                                        rateField == "PSFuzzy" ? p.PSFuzzy :
                                                        rateField == "PS100Match_Rep" ? p.PS100Match_Rep :
                                                        rateField == "PSLinquisticHourlyRate" ? p.PSLinquisticHourlyRate :
                                                        rateField == "PSDTPRate" ? p.PSDTPRate :
                                                        rateField == "PS_FZ50" ? p.PS_FZ50 :
                                                        rateField == "PS_FZ75" ? p.PS_FZ75 :
                                                        rateField == "PS_FZ85" ? p.PS_FZ85 :
                                                        rateField == "PS_FZ95" ? p.PS_FZ95 :
                                                        rateField == "PS_FZ100" ? p.PS_FZ100 :
                                                        rateField == "PS_FZREPS" ? p.PS_FZREPS :
                                                        rateField == "PSPerfectMatch" ? p.PSPerfectMatch : null
                                                     ) - (s.VolumeDiscountValue == null ? 0 : s.VolumeDiscountValue)),
                                 //PSMinFlatCharge = p.PSMinFlatCharge,
                                MinimumFee = p.PSMinFlatCharge,

                                 //Basis = b.PricingBasisDesc,
                                 Basis = task == "DTP" || task == "DTP Edit" ? p.PSDTPType : b.PricingBasisDesc,

                                 StatusOrder = p.CustomerID == customerID ? 0 : p.PSLanguageStatus == null ? 1000 : p.PSLanguageStatus
                             }).Distinct();
  

Ответ №1:

Простой ответ: «не используйте текст».

Он устарел для varchar(max) несколько лет назад, когда был выпущен SQL Server 2005.

Ваш код выдает команду SELECT DISTINCT.
Вам нужно исправить модель / таблицы, чтобы это не был text тип данных

Комментарии:

1. 1 Хороший ответ gbn. Ты действительно хранишь здесь более 8000 символов, Стив? Если это так, используйте varchar (max). Как сказал gbn, текст уже некоторое время не рекомендуется. Кроме того, я бы задался вопросом, почему так много логики относится к прикладному уровню. Я бы рекомендовал поместить каждую унцию этого в хранимую процедуру. Только мои 2 цента.

2. Я надеялся, что есть способ сделать это без изменения схемы, например, приведение чего-либо в инструкции Linq.

3. @SteveB: в конечном итоге вам придется это сделать. Исправить это в LINQ — неправильный способ.

4. я только что изменил свой столбец с ntext на nvarchar (максимум), теперь я могу извлекать детали с помощью linq

5. Эта же ошибка также возникает для типов CLR, таких как geography, geometry и hierarchyid, которые определенно не являются устаревшими, и решение проблемы заключается в том, чтобы не обходить проблему путем приведения всего к varchar (MAX) / nvarchar (MAX).

Ответ №2:

Приведите любые текстовые типы данных к varchar(max) .

Если вы можете указать фактический столбец из вашего кода, я покажу вам, как select будет выглядеть.

Комментарии:

1. 1 — если ваша проблема связана с хранимой процедурой, и вы не можете изменить тип данных столбца

2. Спасибо, это сработало хорошо, поскольку наша база данных хотела, чтобы мы удалили и повторно загрузили исходную таблицу!

Ответ №3:

Приведите ваши ТЕКСТОВЫЕ типы данных к VARCHAR (MAX), вот так…

 SELECT DISTINCT CAST(emailaddr AS VARCHAR(MAX)) AS emailaddr FROM myTable
  

Или используйте VARCHAR(8000), поскольку это фактически одно и то же.