#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), поскольку это фактически одно и то же.