LINQ to entities ne reconnaît pas la méthode " du Système.String[] Split(Char []) "méthode",
Je suis en train de mettre en œuvre une méthode où les mots-clés stockées dans la base de données pour une activité (séparées par une virgule) correspondent à la remise chaîne de caractères séparées par une virgule.
public List<TblActivities> SearchByMultipleKeyword(string keywords)
{
string[] keyword = keywords.Split(',');
var results = (from a in Entities.TblActivities
where a.Keywords.Split(',').Any(p => keyword.Contains(p))
select a).ToList();
return results;
}
J'obtiens l'erreur suivante :
LINQ to Entities does not recognize the method 'System.String[] Split(Char[])' method,
and this method cannot be translated into a store expression.
Le message d'erreur indique que vous ne pouvez pas utiliser les fonctions, qu'ils ne sont pas disponibles (Il n'existe pas de cartographie entre ces fonctions et TSQL) UNE meilleure option pourrait être d'utiliser le contexte.ExecuteStoreQuery où vous pouvez écrire le SQL vous-même
Avez-vous des questions connexes sur le côté droit? Un rapide coup d'œil suggère que vous allez trouver votre réponse assez rapidement...
Ne peut pas en désaccord avec vous. La bonne option est de normaliser la base de données de sorte que vous pouvez réellement utiliser SQL, et les indices et les statistiques de la table. Sinon, quel est le point de l'utilisation d'un SGBDR. Si vous voulez vraiment faire ce CSV gubbins, utiliser un schemaless base de données au lieu!
pas forcément vrai, nous ne connaissons pas le contexte de la colonne mots clés, il pourrait ne pas être normalizable, mais je suis d'accord, si elle a été normalisée, il serait mieux
Avez-vous des questions connexes sur le côté droit? Un rapide coup d'œil suggère que vous allez trouver votre réponse assez rapidement...
Ne peut pas en désaccord avec vous. La bonne option est de normaliser la base de données de sorte que vous pouvez réellement utiliser SQL, et les indices et les statistiques de la table. Sinon, quel est le point de l'utilisation d'un SGBDR. Si vous voulez vraiment faire ce CSV gubbins, utiliser un schemaless base de données au lieu!
pas forcément vrai, nous ne connaissons pas le contexte de la colonne mots clés, il pourrait ne pas être normalizable, mais je suis d'accord, si elle a été normalisée, il serait mieux
OriginalL'auteur rikket | 2014-05-29
Vous devez vous connecter pour publier un commentaire.
Pour les requêtes qui ne comportent pas trop de mots clés et de trop nombreuses lignes vous pourriez mettre en œuvre cette solution simple et rapide. Vous pouvez facilement obtenir autour de la fonction de répartition de façon répétée en affinant les résultats comme suit:
OriginalL'auteur cmaduro
Vous ne pouvez pas faire cela en utilisant Entity Framework, comme le message d'erreur dit.
Cependant, il ya des options.
Une option est de se rendre compte que, si les mots clés sont stockées en tant que
A,B,C,D
, puisx
est là siQui fonctionne si
x
ne contient pas de,
lui-même. L'inconvénient est que cela va faire un scan complet de la table ou d'un index contenant leKeywords
colonne.L'autre option est de normaliser votre base de données. Après tout, vous avez un "un à plusieurs" de la relation entre l'activité et le mot clé. Ensuite le modèle en tant que tel: en plus d'une
Activities
table (sans la colonne mots clés), ont unKeyWords
tableau avec deux colonnes, une clé étrangère pour vos activités de la table, et unkeyword
colonne. Cela vous permettra d'ajouter un index sur lakeyword
colonne, ce qui peut rendre la requête de super-rapide.Mise à JOUR
J'ai relu votre question, et a remarqué que vous n'êtes pas de test pour le mot-clé de l'égalité, mais juste
Contains
. Si oui, pourquoi ne pas vous venez de faire le suivant?Vous avez oublié le cas où vous avez seulement Un stockées. Ajouter ceci : un.Mots-clés.StartsWith(x) ||
OriginalL'auteur Kris Vandermotten
String.Split
n'est pas pris en charge par Entity Framework. C'est tout simplement parce que il n'y a pas d'équivalent dans SQL.Une solution est:
Cet article propose plusieurs solutions: http://sqlperformance.com/2012/07/t-sql-queries/split-strings
[EdmFunction]
attribut comme expliqué ici: Comment appeler DB fonction de EF requête LINQ?OriginalL'auteur nlips
LINQ to entities essaie de traduire votre requête LINQ en SQL. Car il ne sais pas comment faire
String.Split
dans une requête SQL, il échoue.Cela signifie que si vous voulez écrire un SQL de mise en œuvre de
String.Split
, vous ne pouvez le faire qu'en LINQ to objects, ce qui signifie que vous avez besoin de charger l'ensemble de vos données en mémoire, puis de faire dewhere
clause. Un moyen facile de faire cela est d'utiliser.ToList()
:Je suis d'accord. Sans doute la bonne solution est soit de modifier la base de données ou d'écrire du SQL personnalisé, mais l'une de celles qui semblait en dehors de la portée de la question.
OriginalL'auteur Ben Aaronson
Oui, vous pouvez le faire comme ça:
OriginalL'auteur Grigor Margaritov
Pas certain, mais vous pouvez essayer:
Depuis l'erreur semble être à la recherche d'un tableau, cela pourrait fonctionner.
OriginalL'auteur n4gy3