2009-09-13 8 views
0

J'ai le code ci-dessous mais il me donne une erreur àLINQ dynamique où mais propre Chars spécial premier

.Where(p => Regex.Replace(p.Phone, rgPattern, "") == Regex.Replace(phone.Trim(), rgPattern, "") 

string rgPattern = @"[\\\/:\*\?""<>|()-]"; 

var members = from m in Context.Members select m; 

    if (!String.IsNullOrEmpty(phone)) 
    members = members.Where(p => Regex.Replace(p.Phone, rgPattern, "") == Regex.Replace(phone.Trim(), rgPattern, "")); 

Je sais que le commnand LINQ ne sera exécuté que je lance:

members.OrderBy(orderBy).Skip(startRow).Take(maxRows).ToList(); 

Tous idée de comment nettoyer la valeur avant de comparer?

Répondre

1

Ceci est probablement un problème avec votre architecture de données. C'est pourquoi nous gardons les données propres dans les tableaux tout le temps - donc vous n'avez pas à faire de mauvaises choses comme ça.

Vous avez deux options:

  1. nettoyer vos données réelles et ajouter des protections sur la couche de données pour garder vos numéros de téléphone pur. Dans vos données, créez une vue ou une colonne calculée qui nettoie le numéro de téléphone sur la couche de données, puis mappe vers ce numéro de téléphone propre et interroge cette colonne à la place. Appelez ToList() sur un sous-ensemble de vos lignes avant d'exécuter votre requête regex, puis utilisez Linq to Objects pour exécuter l'expression régulière sur ces lignes. Cela peut être prohibitif si vous ne pouvez pas réduire suffisamment vos lignes avant d'utiliser Linq to Objects.