2010-07-07 4 views
2

Je passe lentement sur une application de MySQL pour utiliser Linq2Sql - mais une requête m'a un peu troublé.Comment écrire ceci dans LINQ2SQL?

SELECT * FROM pages où DomainID = @reportid ET ('display: [\ t] * none' PageContent REGEXP)> 0 ORDER BY URL ASC

Toutes les idées sur la façon dont je voulais écrire quelque chose comme ça avec Linq2SQL? C'est le bit REGEXP qui m'a bloqué?

+0

Donc, si je comprends bien, il cherche une page qui ne contient pas de contenu « caché » (c.-à-rien dans la page dit'Affichage: none', avec zéro ou plusieurs espaces ou des tabulations entre le « : 'et le' none '? – StriplingWarrior

Répondre

1

Pourquoi ne pas utiliser LINQ pour retourner les articles qui correspondent à sur ReportID et qui contiennent « affichage: », afin de minimiser la quantité de données renvoyées par le serveur, puis utiliser regex côté client pour filtrer cette liste?

var query = Pages.Where(p => p.DomainId == 1 && p.PageContent.IndexOf("display:") > 0).OrderBy(o => o.URL); 

var regex = new Regex(@"display\:[\t]*none"); 

foreach (var page in query) 
{ 
    if(regex.IsMatch(page.PageContent)) 
    { 
     // Do whatever...      
    }      
} 
5

Il n'y a aucun moyen d'intégrer LINQ to SQL, mais vous avez d'autres choix. Le premier est à load your strings in as in-memory objects which you can apply Regex functions to. Je ne suis pas un grand fan de cela, car il semble que vous êtes en train d'obtenir de très gros résultats.

La deuxième option consiste à tirer parti de SQL CLR as described here. Cela vous permet effectivement de créer une procédure stockée qui est liée à une méthode CLR que vous créez. Chaque fois que vous appelez la méthode dans un contexte LINQ to SQL, elle est convertie en appel de procédure stockée. Ensuite, vous utilisez une requête comme ceci:

var q = from p in context.Pages 
     where p.DomainId == reportId && 
       RegExMatch(p.PageContent, "display\:[ \t]*none") 
     select p; 
+1

+1, si la partie Regex est requise, un proc stocké par CLR est probablement le chemin à parcourir. – kprobst