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

J’essaie d’implémenter une méthode dans laquelle les mots-clés stockés dans la firebase database pour une activité (divisés par une virgule) correspondent à la chaîne généralisée divisée par une virgule.

public List SearchByMultipleKeyword(ssortingng keywords) { ssortingng[] keyword = keywords.Split(','); var results = (from a in Entities.TblActivities where a.Keywords.Split(',').Any(p => keyword.Contains(p)) select a).ToList(); return results; } 

Je reçois l’erreur suivante :

 LINQ to Entities does not recognize the method 'System.Ssortingng[] Split(Char[])' method, and this method cannot be translated into a store expression. 

Pour les requêtes qui ne comportent pas trop de mots-clés et de lignes, vous pouvez implémenter cette solution simple et rapide. Vous pouvez facilement contourner la fonction Diviser en affinant de manière répétée vos résultats comme suit:

  public List SearchByMultipleKeyword(ssortingng keywords) { ssortingng[] keywords = pKeywords.Split(','); var results = Entities.TblActivities.AsQueryable(); foreach(ssortingng k in keywords){ results = from a in results where a.Keywords.Contains(k) select a; } return results.ToList(); } 

Vous ne pouvez pas faire cela en utilisant Entity Framework, comme le dit le message d’erreur.

Cependant, il existe des options.

Une option consiste à réaliser que, si les mots-clés sont stockés sous A,B,C,D , alors x est là si

 a.Keywords.StartsWith(x + ",") || a.Keywords.Contains("," + x + ",") || a.Keywords.EndsWith("," + x) 

Cela fonctionne si x ne contient pas lui , même. L’inconvénient est que cela effectuera une parsing complète de la table ou d’un index contenant la colonne KeywordsKeywords .

L’autre option consiste à normaliser votre firebase database. Après tout, vous avez une relation un à plusieurs entre activité et mot clé. Ensuite, modélisez-le comme tel: en plus d’une table Activities (sans la colonne Mots-clés), disposez d’une table KeyWords avec deux colonnes, d’une clé étrangère pour votre table d’activités et d’une colonne de keywordkeyword . Cela vous permettra d’append un index sur la colonne de keywordkeyword , ce qui peut rendre la requête extrêmement rapide.

METTRE À JOUR

J’ai relu votre question et j’ai remarqué que vous ne testez pas l’égalité des mots clés, mais simplement le Contains . Si oui, pourquoi ne faites-vous pas ce qui suit?

 a.Keywords.Contains(x) 

Ssortingng.Split n’est pas pris en charge par Entity Framework. C’est simplement parce qu’il n’y a pas d’équivalent en SQL.

Une solution est:

  1. définir une fonction personnalisée dans la firebase database Cet article propose plusieurs solutions: http://sqlperformance.com/2012/07/t-sql-queries/split-ssortingngs
  2. pour déclarer cette fonction utilisable par LINQ aux entités à l’aide de l’atsortingbut [EdmFunction] comme expliqué ci-après: Comment appeler une fonction de firebase database à partir d’une requête EF LINQ?

LINQ to Entities tente de traduire votre requête LINQ en SQL. Puisqu’il ne sait pas comment faire Ssortingng.Split dans une requête SQL, il échoue.

Cela signifie que, sauf si vous souhaitez écrire une implémentation SQL de Ssortingng.Split , vous ne pouvez le faire que dans LINQ to Ssortingng.Split , ce qui signifie que vous devez d’abord charger toutes vos données en mémoire, puis faire la clause where . Une méthode simple consiste à utiliser .ToList() :

 var results = (from a in Entities.TblActivities select a).ToList(); //Results are now in memory results = results.Where(a => a.Keywords.Split(',').Any(p => keyword.Contains(p))).ToList(); //This uses LINQ-to-objects 

Oui, vous pouvez le faire comme ça:

 public List SearchByMultipleKeyword(ssortingng keywords) { ssortingng[] keywordsSeparated = keywords.Split(','); var results = (from a in Entities.TblActivities where keywordsSeparated.Any(keyword => a.Keywords.Contains(keyword)) select a).ToList(); return results; } 

Pas sûr, mais vous pouvez essayer: Puisque l’erreur semble rechercher un tableau, cela pourrait fonctionner.

 ssortingng[] keyword = keywords.Split(new char[] {','}); var results = (from a in Entities.TblActivities where a.Keywords.Split(new char[] {','}).Any(p => keyword.Contains(p)) select a).ToList();