LINQ to Entities ne reconnaît pas la méthode ‘Int32 IndexOf (System.Ssortingng, System.SsortingngComparison)’

J’ai exécuté une requête linq en utilisant Entityframework comme ci-dessous

GroupMaster getGroup = null; getGroup = DataContext.Groups.FirstOrDefault(item => keyword.IndexOf(item.Keywords,SsortingngComparison.OrdinalIgnoreCase)>=0 && item.IsEnabled) 

lors de l’exécution de cette méthode, je suis une exception comme ci-dessous

LINQ to Entities ne reconnaît pas la méthode ‘Int32 IndexOf (System.Ssortingng, System.SsortingngComparison)’, et cette méthode ne peut pas être traduite en une expression de magasin.

La méthode Contains () par défaut est sensible à la casse. Une fois encore, j’ai besoin de convertir en lower. Y at-il une méthode pour vérifier une correspondance de chaîne autre que la méthode includes et une méthode pour résoudre le problème de la méthode indexOf?

Vous avez vraiment seulement quatre options ici.

  1. Modifier le classement de la firebase database globalement. Cela peut être fait de plusieurs manières, une simple recherche sur Google devrait les révéler.
  2. Modifier le classement de tables ou de colonnes individuelles.
  3. Utilisez une procédure stockée et spécifiez l’instruction COLATE dans votre requête
  4. effectuez une requête et renvoyez un grand nombre de résultats, puis filtrez en mémoire à l’aide de Linq to Objects.

le numéro 4 n’est pas une bonne option à moins que votre jeu de résultats ne soit assez petit. # 3 est bon si vous ne pouvez pas changer la firebase database (mais vous ne pouvez pas utiliser Linq avec elle).

les numéros 1 et 2 sont des choix que vous devez faire à propos de votre modèle de données dans son ensemble ou si vous souhaitez le faire uniquement dans des champs spécifiques.

Modification du classement des serveurs: http://technet.microsoft.com/en-us/library/ms179254.aspx

Modification du classement de la firebase database: http://technet.microsoft.com/en-us/library/ms179254.aspx

Modification du classement des colonnes: http://technet.microsoft.com/en-us/library/ms190920(v=sql.105).aspx

Utilisation de l’instruction Collate dans un proc stocké: http://technet.microsoft.com/en-us/library/ms184391.aspx

La méthode IndexOf de la classe de chaîne ne sera pas reconnue par Entity Framework, veuillez remplacer cette fonction par une fonction SQL ou des fonctions canoniques

Vous pouvez également prendre de l’aide d’ ici ou peut-être ici

Vous pouvez utiliser l’exemple de code ci-dessous:

 DataContext.Groups.FirstOrDefault(item => System.Data.Objects.SqlClient.SqlFunctions.CharIndex(item.Keywords, keyword).Value >=0 && item.IsEnabled) 

Au lieu de cela, vous pouvez utiliser pour réduire les cas cette méthode ci-dessous:

 var lowerCaseItem = item.ToLower(); 

Si votre article est de type ssortingng . Et cela pourrait vous permettre de traverser cette exception.

La réponse de Erik Funkenbush est parfaitement valide quand on la regarde comme un problème de firebase database. Mais j’ai l’impression que vous avez besoin d’une meilleure structure pour conserver les données relatives aux mots-clés si vous souhaitez les parcourir efficacement.

Notez que cette réponse n’est pas censée être meilleure , elle vise à résoudre le problème de votre modèle de données plutôt que de faire en sorte que l’environnement s’adapte au modèle de données actuel (apparemment défectueux, car il y a un problème).

Ma suggestion principale, indépendamment de la contrainte de temps (je réalise que ce n’est pas la solution la plus simple), serait d’append un tableau séparé pour les mots-clés (avec une relation plusieurs à plusieurs avec ses classes associées).

 [GROUPS] * ------- * [KEYWORD] 

Cela devrait vous permettre de rechercher le mot clé et de ne récupérer que les éléments auxquels ce mot clé est associé (en fonction de l’ID plutôt que d’une chaîne composée).

 int? keywordID = DataContext.Keywords.Where(x => x.Name == keywordFilter).Select(x => x.Id).FirstOrDefault(); if(keywordID != null) { getGroup = DataContext.Groups.FirstOrDefault(group => group.Keywords.Any(kw => kw.Id == keywordID)); } 

Mais je peux comprendre complètement si ce type de correctif n’est plus possible dans le projet actuel. Je voulais cependant le mentionner, au cas où quelqu’un à l’avenir trébuche sur cette question et a toujours la possibilité d’améliorer la structure de données.