Entity Framework, LINQ contient pas insensible à la casse
Je vais avoir quelques "m'arracher les cheveux'-problème avec Entity Framework et je ne peux pas trouver une solution.
Ce que je veux faire est de comparer les chaînes pour une fonction de recherche, je suis en cours d'exécution sur le serveur. En gros, c'est: collection.Where(c => c.Name.Contains(searchTerm));
où searchTerm est une chaîne de caractères passée par l'utilisateur.
Partout où je regarde, c'est soit:
- Changement de chaîne avec toUpper(), ou
- Jeu de classement à une casse.
Cependant aucune de ces situations s'applique à mon cas. Voici une question similaire, ce qui ne veut pas avoir de réponse: Entity Framework - casse Contient?
À l'aide de la première variante, on obtiendra chaque ligne de la base de données, puis effectuer toUpper(), pour voir si c'est un match. C'est inacceptable en terme de performance.
La deuxième approche semble plus susceptible d'être une solution valable, mais pour une raison quelconque de ne pas fonctionner. J'ai deux bases de données. L'une locale et l'autre à distance. La distance MSSQL base de données est définie classement: Finnish_Swedish_CI_AS, ce qui signifie qu'il est insensible à la casse? La base de données locale est généré automatiquement localDB avec la propriété "casse" la valeur False.
N'importe laquelle de ces deux bases de données j'utilise, il est toujours Sensible à la casse pour les utilisateurs.
Quelqu'un peut-il expliquer pourquoi ce qui se passe pour que je puisse aller avec ma misérable vie?
Salutations,
Robin Dorbell
Donc tu veux dire que le IndexOf solution ne serait pas de dire à entity framework pour récupérer tous les enregistrements avant de les comparer?
Avez-vous lu cette réponse sur les différentes langues? stackoverflow.com/questions/444798/... il implique que vous devez utiliser la classe CultureInfo à la place.
Êtes-vous certain que la recherche est en cours d'exécution sur le serveur? Vérifiez le type de "_collection"? Si c'est
IEnumerable<?>
la requête s'exécute dans le code C#, pas sur le serveur de base de données (et être sensible à la casse). Si c'est IQueryable<?>
puis c'est PEUT-être en cours d'exécution sur le serveur de base de données.Que peut-être elle. Les collections de type est
ICollection<T>
.OriginalL'auteur Robin Dorbell | 2014-08-14
Vous devez vous connecter pour publier un commentaire.
Les commentaires, on dirait que l'OP est un moulage de la IQueryable liste à une ICollection d'abord, en ce sens que toute LINQ est en cours d'exécution "localement" plutôt que d'avoir la chance d'être converti à SQL.
Par exemple,
Cela peut avoir contribué à déboguer le problème: Comment puis-je visualiser le code SQL généré par l'entity framework?
OriginalL'auteur Dunc
Il n'a jamais été sensible à la casse pour moi, mais je suppose que c'est juste la façon dont j'ai mis ma base de données. Vous pouvez certainement utiliser votre première option de conversion les deux majuscules, EF ne pas tirer dans la mémoire pour le faire, informe SQL server pour le faire. Par exemple:
Produit le SQL (ish, je l'ai fait avec linqtosql mais EF devrait être assez similaire):
Ah, bien, là où votre collection de venir à partir de là? Si c'est une collection puis il est déjà dans la mémoire afin de l'appelant
.ToUpper()
sur les choses à ne pas faire de différence de bouillie.OriginalL'auteur Ben
Utiliser des chaînes de caractères.Est égal à
Aussi, vous n'avez pas à vous soucier de la valeur null et récupérer uniquement les informations que vous souhaitez.
Utilisation StringComparision.CurrentCulture pour la casse.
Equals
voudrais essayer de faire correspondre le mot exactement - qui n'est pas ce que je voulais. Le problème était que Dunc a écrit, que la requête a été fait après l'extraction de tout à partir du serveur.OriginalL'auteur Darshan Joshi