2009-06-20 10 views
0

Ok,Requête de recherche avec Subsonic

Aujourd'hui j'essaie d'apprendre Subsonic. Des trucs plutôt cool. J'essaie d'intégrer certaines fonctionnalités de recherche dans mon site Web, mais je n'arrive pas à comprendre comment je pourrais y parvenir avec Subsonic.

J'ai un champ de recherche qui pourrait contenir plusieurs mots-clés. Je souhaite renvoyer des résultats correspondant à tous les mots clés. La cible de la recherche est une colonne de texte unique.

Jusqu'à présent, j'ai ce (il fonctionne, mais ne retourne jamais les résultats):

return new SubSonic.Select().From(Visit.Schema) 
      .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn) 
      .Where(InfopathArchive.XmlDocColumn).Like(keywords) 
      .ExecuteTypedList<Visit>();  

Il y a un à un entre la table de visite et la table InfoPathArchive. Je veux juste retourner la collection de visites qui ont les mots-clés dans le XMLDocColumn connexe.

Si je pouvais faire fonctionner ça, ce serait génial. Maintenant, le deuxième problème est que si quelqu'un cherche 'australia processmodel' alors évidemment le code ci-dessus ne devrait renvoyer que cette phrase exacte. Comment puis-je créer une requête qui scinde mon terme de recherche afin qu'il renvoie des documents contenant TOUS les termes de recherche individuels?

Toute aide appréciée. Edit: Ok, donc la recherche de base fonctionne, mais la recherche par mot-clé multiple ne fonctionne pas. J'ai fait ce qu'Adam a suggéré mais il semble que Subsonic n'utilise qu'un seul paramètre pour la requête.

Voici le code:

 List<string> wordsInQueryList = keywords.Split(' ').ToList(); 

     SqlQuery q = Select.AllColumnsFrom<Visit>() 
      .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn) 
      .Where(Visit.IsDeletedColumn).IsEqualTo(false); 

     foreach(string wordInQuery in wordsInQueryList) 
     { 
      q = q.And(InfopathArchive.XmlDocColumn).Like("%" + wordInQuery + "%"); 
     } 

q.ExecuteTypedList de retour();

Alors si je regarde la requête qui génère Subsonic:

SELECT (bunch of columns) 

FROM [dbo].[Visit] 
INNER JOIN [dbo].[InfopathArchive] ON [dbo].[Visit].[VisitId] = [dbo].[InfopathArchive].[VisitId] 
WHERE [dbo].[Visit].[IsDeleted] = @IsDeleted 
AND [dbo].[InfopathArchive].[XmlDoc] LIKE @XmlDoc 
AND [dbo].[InfopathArchive].[XmlDoc] LIKE @XmlDoc 

Il finit que seul le dernier mot-clé est recherché.

Des idées?

+0

Est-ce un bug dans les versions précédentes de Subsonic? Im utilisant 2.1 et n'ont pas vraiment l'option de mise à niveau à ce stade. – Alex

Répondre

1

Première question:

return new SubSonic.Select().From(Visit.Schema) 
     .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn) 
     .Where(InfopathArchive.XmlDocColumn).Like("%" + keywords + "%") 
     .ExecuteTypedList<Visit>(); 

Deuxième question:

passer une liste de mots dans votre requête à une fonction qui crée une requête subsonique comme suit

SqlQuery query = DB.Select().From(Visit.Schema) 
     .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn) 
     .Where("1=1"); 

foreach(string wordInQuery in wordsInQueryList) 
{ 
    query = query.And(InfopathArchive.XmlDocColumn).Like("%" + wordInQuery + "%") 
} 

return query.ExecuteTypedList<Visit>(); 

c'est évidemment non testé mais il devrait vous diriger dans la bonne direction.

+0

Excellent. Merci de votre aide. Pourquoi la performance est-elle si bonne? Je m'attendais à ce qu'une requête comme celle-ci soit plutôt lente. Je suppose que c'est une question que je peux vivre sans connaître la réponse si;) – Alex

1

Vous pouvez faire ce qu'Adam suggère ou avec 2.2 vous pouvez simplement utiliser "Contains()" au lieu de Like ("% ...%"). Nous soutenons également StartsWith et EndsWith() :)

+0

Alors que votre ici Rob - quand est Subsonic 3 va être hors?Je veux pousser l'utilisation de Subsonic pour notre DAL et les ajouts de LINQ m'aideraient à présenter un argument très fort. – Alex

Questions connexes