J'utilise C # pour afficher une liste de titres de films que j'appelle à partir d'une base de données SQLite. Actuellement, j'utilise une classe Listbox personnalisée qui a une fonction pour trier le texte en décapant le mot "le" du début de chaque article. Cependant, il ne semble pas exactement le moyen le plus simple de le faire, car il appelle la base de données SQLite et alors em> tricheurs. Je préférerais le couper à une seule étape, espérons trier directement de la base de données dans ma requête "Select". P>
J'ai fait des recherches sur cela et j'ai trouvé des suggestions, notamment de créer une colonne de tri supplémentaire par la base de données. Bien que ce soit certainement une possibilité, je me demande s'il existe des options plus simples qui ne nécessitent pas d'insertion d'informations doublantes presque identiques (surtout si la base de données devient plus grande). Je suis assez nouveau à SQLite, mais j'ai lu quelque chose à propos de la création d'une fonction d'assemblage pouvant être utilisée pour créer une commande personnalisée. Cependant, je ne suis pas sûr que cela soit utilisé pour cela et je ne peux pas sembler trouver de l'aide pour la mettre en œuvre en C #. P>
espérant que quelqu'un pourrait être capable de partager des conseils. Si une colonne de tri supplémentaire est la meilleure façon d'aller, c'est ce que je ferai. P>
6 Réponses :
Pour éviter d'insérer des données en double, qu'en est-il d'avoir deux colonnes: titre_prefix (généralement vide, mais contient parfois "le", ou "A"; aucun index sur cette colonne) et le titre (contient le titre sans "The" ou " A "; c'est la colonne que vous créez l'index sur). Pour afficher les données, vous devez combiner titre_prefix et titre. Mais vous venez de chercher sur le titre. P>
Vous pouvez stocker chaque titre en 2 parties: avec sqlite Vous pouvez combiner 2 valeurs de chaîne via le Voici un exemple: p> Vous pouvez également utiliser < Code> ltrim code> dans le préficiel de case est vide, vous n'avez donc pas de place à l'avant: p> Une autre alternative consiste à stocker le préfixe à la fin du titre. Par exemple, dans beaucoup de magasins de films, vous verrez quelque chose comme: p> trois mousquetaires, le p>
blockQuote> p> titre code> et
préfixe code>.
|| Opérateur code> également appelé opérateur de concaténate code>. p>
dans le code C # strong> Si vous vouliez faire cela dans C #, utilisez LINQ pour effectuer la commande pour vous. J'ai posté un échantillon complet sur Pastebin . Cela vous permettra de: P> dans votre instruction SQLite forte> p> Que diriez-vous de simplement remplacer les mots de bruit avec des blancs dans l'ordre? C'est une première étape laid, mais considérons fermement une nouvelle colonne pour stocker cette valeur à des fins de tri. P> Certes, cela devient laid quand vous vous retrouvez avec ceci: P >
REPLACE(REPLACE(REPLACE(REPLACE([title],'The ',''),'a',''),'of',''),'by','')
Cela ne permettra pas à la base de données d'utiliser un index sur titre code> si on existe. Et on dirait que l'OP s'attend à beaucoup de données.
@Daniel: En effet, vous avez raison sur l'index. Pour High Perf, OP pourrait vouloir trouver un autre dB à part de SQLite. La solution C # est beaucoup plus attrayante. Le tri appartient vraiment au client, peu importe la SGDBR.
@downvoter: SOINS Pour expliquer pourquoi le tri en utilisant Linq n'aide pas? Que diriez-vous de la suggestion d'une nouvelle colonne pour stocker la valeur «tri»? Comment l'une de ces suggestions a-t-elle obtenu un bowvote?
L'utilisation de la fonction Remplacer () ne fonctionne pas, en particulier avec 'A'. Vous remplacerez toute la lettre A avec rien. Signification "Apple" devient "Pple", probablement pas ce que tu voulais.
Vous pouvez essayer de construire une table prenant en charge la recherche en texte intégral (à l'aide du FTS module ) sur le titre. Ensuite, vous pourrez effectuer des recherches rapides sur tous les mots du titre sans avoir besoin de beaucoup de travail supplémentaire de votre part. Par exemple, une requête d'utilisateur de bonne mauvaise laidule kbd> pourrait produire "le bien, le mauvais et le laid" comme l'un de ses premiers résultats. Le coût supplémentaire de tout cela représente environ un quart de la durée du texte en général, mais pourrait être plus pour votre jeu de données, car les titres ne sont pas du texte anglais complet. Vous devez également passer le temps à construire ces indices supplémentaires - vous ne voulez pas les construire sur votre ensemble de données principal sur un système en direct (évidemment) - mais cela ne devrait pas être trop gros problème. P>
Créer une colonne virtuelle (résultat d'une fonction pouvant être implémentée dans C #) et trier sur cette colonne virtuelle. La fonction pourrait déplacer "le" à la fin comme dans "trois mousquetaires, le" ou le défausse "Le", tout ce que vous voulez faire. P>
Il y a une documentation sur la façon de faire cela quelque part sur le site System.Data.Sqlite. Les sortes seraient effectuées dans votre instruction SELECT dans SQLite, bien que vous abandonniez l'accès à l'index sur le tri. Je suppose que vous n'avez pas de milliers et de milliers de titres dans vos Resultats si vous les mettez dans une liste de liste maintenant, ce qui ne devrait pas être un problème.
Voici un exemple de ce que je veux dire:
ivankrisianto.com/software-Development/visual-studio-net/...
Voici la solution:
ORDER BY (CASE WHEN sortTitle LIKE 'the %' THEN substr(sortTitle,5) WHEN sortTitle LIKE 'a %' THEN substr(sortTitle,3) WHEN sortTitle LIKE 'an %' THEN substr(sortTitle,4) ELSE sortTitle END)
N'oubliez pas que vos utilisateurs peuvent utiliser une langue autre que l'anglais.