Comment faire pour simuler des expressions régulières dans LINQ-to-SQL
J'ai une table de base de données avec les numéros de compte client. Dans le même tableau sont des comptes de test qui ne correspondent pas à la production de formatage: "dis: 'A1111' est de la production, mais "JTest' ne l'est pas. J'ai la Regex qui va tirer seulement mes comptes de production. J'ai besoin d'une requête compilé pour tirer seulement les comptes de production. La requête me donne un comptage des clients par région et par jour; et le concept de compte au sein de chaque région:
getCustomerDistribution = CompiledQuery.Compile<DataContext, String, DateTime, IEnumerable<ServerLoad>>(
(context, region, processDate) => (from cust in context.GetTable<tbl_CustomerDistro>()
where cust.ProcessedDate.Date == processDate.Date
where cust.Region == region
where Regex.IsMatch(cust.AcctNum, ProductionMask)
group cust by new
{
cust.Region,
cust.Concept
} into custDistro
orderby custDistro.Key.Region
select new CustomerDistro
(
custDistro.Key.Region,
custDistro.Key.Concept,
custDistro
.Where(c => c.Concept == custDistro.Key.Concept)
.Select(c => c.Concept).Count()
)));
Problème est que je reçois le message suivant au moment de l'exécution:
Méthode Boolean IsMatch(Système D'.Chaîne,
Système.String)' n'a pas pris en charge
traduction en SQL.
J'ai été à la recherche à un utilisateur défini func:
static Func<striing, bool> IsProduction = (AcctNum) => Regex.IsMatch(AcctNum, ProductionMask);
Cela ne fonctionne pas non plus. Je ne veux pas répéter les enregistrements qui sont extraites à filtrer à moins qu'il n'y a simplement pas d'autre moyen pour ce faire.
Est-il un moyen de le faire avec Prédicat Builder?
Mise à jour:
Une autre option, je pense, serait d'utiliser:
where SqlMethods.Like (cust.AcctNum, ProductionMask)
Cependant, mon ProductionMask est écrit pour les Regex:
^[B,G]\d{4}$
Est-il un moyen de le faire avec le SqlMethods.Comme(...)?
Mise à jour 2:
C'est une très lent en cours d'exécution de la requête. J'ai 3 régions que cette requête s'exécute contre et le nombre d'enregistrements & les délais de retour sont les suivantes:
263: 903ms
342: 822ms
146: 711ms
OriginalL'auteur IAbstract | 2011-04-19
Vous devez vous connecter pour publier un commentaire.
J'ai changé la requête à utiliser les éléments suivants à la place de la
Regex.IsMatch
:où
ProductionMask = "[bBgG][0-9][0-9][0-9][0-9]"
l'équivalent de la RegEx est:
^[B,G]\d{4}$
Si quelqu'un voit que les 2 masques ne doivent pas produire les mêmes résultats, s'il vous plaît laissez-moi savoir...
[bBgG,][0-9][0-9][0-9][0-9]
; la virgule dans[B,G]
a pas d'autre sens que "correspond à une virgule". À moins que la virgule dans l'original regex était une erreur (je pense que c'est, mais quand même).Original regex était prévu il y a longtemps 🙂 Peut ne pas avoir besoin de l' ',' ...merci pour l'info, si!
OriginalL'auteur IAbstract
Êtes-vous à l'aide de LINQ-to-SQL? Si oui, Les forums MSDN de la manière suivante:
Il donne 3 solutions de rechange.
Je me demande si l'option 2. "Utilisation de l'intégration du CLR avec SQL 2005 à écrire un personnalisé fonction Regex" peut être combiné avec LINQ-to-SQL ou EF?
Je ne vois pas pourquoi pas pour l'EF comme vous pouvez appeler une procédure en EF, donc ça devrait être bon si c'est juste une procédure CLR. Comme pour LINQ-to-SQL, je ne suis pas si sûr. Il ya une raison pourquoi Microsoft assez bien déprécié en faveur de l'EF il y a quelques années - ses limites.
Votre question ne présente votre scénario de la séparation de la production des dossiers de non-production des comptes par le format de nom, donc
Like
ouBeginsWith
doit travailler pour vous. Si vous avez un plus compliqué expression régulière, peut-être pas.Je pensais avoir quelque chose comme
Customers.Where(c => MyClrClass.MyRegexMatch(c.AcctNum, ProductionMask))
traduit en sql de la requête qui appelle le clr-fonction dans la clause where. Est-ce que vous voir des que possible?OriginalL'auteur bitxwise
spécial merci à Romain Khramtsov et db_developer pour des informations de référence,
et grâce à Microsoft 😛
RegExpLike Extension Pour Sql Server
Liens de référence:
http://www.codeproject.com/Articles/42764/Regular-Expressions-in-MS-SQL-Server-2005-2008
http://msdn.microsoft.com/en-us/library/dd456847.aspx
Etape 1: Compiler SqlRegularExpressions.cs pour générer SqlRegularExpressions.dll
Étape 2: Exécuter DbInstall.sql SQL sur la base de données
DbInstall.sql
DbUninstall.sql
Étape 3: Sur le modèle de diagramme de droite de la souris, sélectionnez “mettre à Jour le Modèle de Base de données...”, utilisez l'assistant de mise à jour pour ajouter des fonctions stockées pour modèle.
Étape 4: Créer des fonctions importées au sein de l'entité contexte de la classe.
Étape 5: Enfin, vous pouvez utiliser des expressions régulières sur LINQ to entities 🙂
OriginalL'auteur Onur
Pourriez-vous remplacer l'expression rationnelle.IsMatch avec
Ou Contient /EndsWith en fonction de vos besoins
OriginalL'auteur Aducci
J'ai eu le même problème, mais a réussi à se débarrasser de lui.
Je sais que c'est lent mais fonctionne, tout d'optimisation/correction de l'indice seront les bienvenus 🙂
Le code rassemble les données d'abord, puis des processus,
si vous avez besoin de filtrer autant que vous le pouvez avant d'appeler
toarray()
ou d'acheter plus de ram 🙂espérons que cela aide,
profitez de
P. S. C'est un moyen rapide pour le traitement de la lumière tableaux de données, vous pouvez
améliorer seulement par l'extraction de colonnes nécessaires pour le traitement et la juste
de retour de l'ID de colonnes pour un accès complet aux lignes. Vous pouvez utiliser mon dernier post
pour un cadre plus général lourds scénarios. Le choix est le vôtre.
oui, vous avez raison, mon code n'est pas adapté pour des tables avec des centaines de milliers de lignes. "SqlMethods.Comme" ça n'a pas fonctionné pour moi, peut-être à cause du fait que je suis en utilisant Entity Framework. Peut-être s'installer pour l'aide BeginsWith,EndsWith,Contient est le mieux pour quelqu'un ou je pense que le meilleur choix peut être de la sélection d'une fonction stockée en prenant une regexp paramètre et retourner les lignes de la table.
mais le meilleur de tout est en attente pour le plein support des expressions régulières dans LINQ pour les entités de Microsoft, je ne pouvais pas attendre plus 🙂
OriginalL'auteur Onur