Chaîne de caractères.Equals() ne fonctionne pas comme prévu
Je suis à l'aide de LINQ to recherche par le biais de l'un de mes Entité Cadre de tables et de trouver un "groupe", basé sur le nom. Le nom est une chaîne de caractères et semble être en Unicode (dit il est dans l'edmx). J'ai une méthode GetGroup()
et je passe un nom à rechercher. Débogage dans le code, j'ai déjà un groupe nommé "Test" dans ma base de données. Une fois que je passe dans un groupe nommé "TEST" je m'attends à un retour du "Test", qui était déjà dans la base de données. Pour une raison quelconque, ne trouve pas le "Test" et pense que "TEST" n'existe pas. Voici ma requête, je ne vois pas pourquoi il ne fonctionne pas. S'il vous plaît aider.
"nom" est le passé dans le nom du groupe. Mon .Equals
semble ne fonctionner que si le gr.Name
et le nom sont exactement les mêmes. Si un personnage est capital dans l'une des deux cordes, puis les .Équivaut ne fonctionne pas. J'ai essayé d'utiliser InvariantCultureIgnoreCase
, et qui ne semble pas aider. Dans le cas où quelqu'un demande, le MyLeagueId
et LeagueId
sera toujours à la hauteur, de la base de données est configuré de sorte qu'il peut être un groupe dans une ligue différente id. Je ne pense pas que ce soit le problème.
Group g = (from gr in this.DatabaseConnection.Groups
where gr.Name.Equals(name, StringComparison.OrdinalIgnoreCase) &&
gr.LeagueId == this.MyLeagueId
select gr).FirstOrDefault();
- Êtes-vous sûr que l'on ne dispose pas d'un espace à la fin/début que l'autre n'ont pas?
- Si les Groupes de la table n'est pas trop gros, alors qu'un test, pouvez-vous essayer de modifier la requête pour ... à partir de fr dans cette.DatabaseConnection.Groupes de.ToList() ...
Vous devez vous connecter pour publier un commentaire.
Lors de l'utilisation de LINQ to entities, il sera automatiquement convertir à LINQ to SQL. Et si le champ de base de données que vous faites .Équivaut à ne pas avoir un rassembler de NOCASE (SQLite dans mon exemple) alors il sera toujours sensible à la casse. Dans otherwords, la base de données définit la manière de faire la comparaison de chaînes de caractères plutôt que du code.
str1 == str2
et il le fait d'une recherche insensible à la casse, donc je n'ai pas besoin de laEquals
tracas. Merci pour vos commentaires.La comparaison de chaînes avec
StringComparison.OrdinalIgnoreCase
fonctionne dans la mémoire ou avecIEnumerable<T>
. Vous essayez de l'utiliser avecIQueryable<T>
, mais le fournisseur de votre queryable ne pas le comprendre.Cela fonctionne pour moi:
string.Equals
n'a pas travaillé, même avec les mêmes arguments. À l'aide de la méthode d'instance a été la solution.Fait quelques recherches. Vous ne pouvez pas le faire. Le classement (le type de comparaison) est défini au niveau de la colonne de la table. Vous ne pouvez pas le modifier par EF. Si elle est définie comme insensibles à la casse, alors toutes les recherches insensibles à la casse. Si elle est définie comme sensible à la casse, alors votre seul espoir est
ToUpper()
les cordes.http://connect.microsoft.com/VisualStudio/feedback/details/435783/entity-framework-conceptual-model-doesnt-support-string-equals-via-linq
http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/3810aa67-f6fe-4624-a14b-eaaa0e05ddcd
EF4 Linq Oracle11g faire des requêtes aucune casse
LINQ to entities comparaison sensible à la casse
Utiliser le
String.Compare()
comme il peut être traduite en Sql.Ici sont quelques exemples de correspondance de chaîne dans Linq, Sql traduction.
J'aime TravyGuy de réponse à partir d'un point de vue technique.
Pour un plus direct, une réponse pratique, essayez d'utiliser:
Essayer
name.Equals(gr.Name, StringComparison.OrdinalIgnoreCase)
Si cela fonctionne alors le problème pourrait être avec
gr.Name
.--- Edit ---
Je devine que
gr.Name
n'est pas de typeSystem.string
. (depuisString.Equals
vous donne une erreur ==> le post précédent)donner un coup de cette
ou