Ignorer les accents dans SQL Server en utilisant LINQ to SQL
Comment puis-je ignorer les accents (comme , `, ~) dans les requêtes faites à une base de données SQL Server en utilisant LINQ à SQL?
mise à jour:
N'a toujours pas trouvé comment le faire dans LINQ (ou même si c'est possible) mais j'ai réussi à changer la base de données pour résoudre ce problème. J'ai juste eu à changer la collation sur les champs que je voulais chercher. La collation que j'avais était:
SQL_Latin1_General_CP1_CI_AS
the city for" Case Insensible" et "Accents". Il suffisait de changer le AS en AI pour le rendre "insensible à L'Accent". La déclaration SQL est la suivante:
ALTER TABLE table_name ALTER COLUMN column_name column_type COLLATE collation_type
4 réponses
dans les requêtes SQL (Sql Server 2000+, si je me souviens bien), vous faites ceci en faisant quelque chose comme select MyString, MyId à partir de MyTable où MyString collate Latin1_General_CI_AI ='aaaa'.
Je ne suis pas sûr que ce soit possible à Linq, mais quelqu'un de plus à L'aise avec Linq peut probablement traduire.
si vous êtes d'accord avec le tri et la sélection / où les requêtes ignorant toujours les accents, vous pouvez modifier la table pour spécifier la même collation sur le ou les champs avec lesquels vous êtes concerné.
voir la réponse suivante:
LINQ Où Ignorer Accentuation et Cas
fondamentalement, vous devez modifier le type de champ dans SQL Server, par exemple
ALTER TABLE People ALTER COLUMN Name [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AI
il ne semble pas y avoir de moyen de le faire en utilisant LINQ, à part appeler une méthode personnalisée pour supprimer les diacritiques (qui ne seraient pas performantes).
LINQ à SQL n'a pas de fonctionnalité spécifique pour définir la collation utilisée pour une requête et il utilisera donc toujours la base de données par défaut.
il semble qu'il y ait un moyen d'ignorer les différences de collation entre Linq et SQL en utilisant les fonctions T-sql:
CREATE FUNCTION [dbo].[func_ConcatWithoutCollation]
(
@param1 varchar(2000),
@param2 varchar(2000)
)
RETURNS varchar(4000)
AS
BEGIN
IF (@param1 IS NULL) SET @param1 = ''
IF (@param2 IS NULL) SET @param2 = ''
RETURN @param1 COLLATE Latin1_General_CS_AS + @param2 COLLATE Latin1_General_CS_AS
END
pour obtenir cette fonction dans linq à sql, il y a un commutateur pour SqlMetal: /functions. Exemple:
"%ProgramFiles%\Microsoft SDKs\Windows\v7.0A\Bin\SqlMetal.exe" /server:. /database:NameOfDatabase /pluralize /code:ContextGenerated.cs /sprocs /views /functions
utilisez cette fonction dans Linq pour sql comme ceci:
from s in context.Services
where context.Func_ConcatWithoutCollation(s.Description, s.Email) == "whatever"
select s
ça m'a aidé, peut-être que quelqu'un trouve ça utile aussi.