2011-07-14 5 views
1

J'ai une table de base de données avec un champ qui a des valeurs telles queLINQ to SQL bizarrerie

AAAA 
BBBB0001 
BBBB0002 
CCCC 
CCCC 
CCCC 

et je voudrais savoir combien AAAAs, BBBBs et CCCC il y a (1, ici 2 et 3) .

Si je mis en place quelques requêtes de test dans LINQPad avec ces valeurs dans un tableau:

var Table = new [] {"AAAA", "BBBB1", "BBBB2", "CCCC", "CCCC", "CCCC"}; 

var query1 = Table.GroupBy(d => d).Select(g => new { K = g.Key, C = g.Count()}); 
query1.Dump(); 

var query2 = Table.GroupBy(d => d.Substring(0, 4)).Select(g => new { K = g.Key, C = g.Count()}); 
query2.Dump(); 

puis-je obtenir les résultats que j'attends - dans le premier cas groupés par la clé et dans le second groupé par les quatre premiers caractères de la clé

AAAA 1 
BBBB1 1 
BBBB2 1 
CCCC 3 

AAAA 1 
BBBB 2 
CCCC 3 

ce qui est bien. Mais si remplacer le tableau par une table SQLite et exécuter les mêmes requêtes, ce que je reçois est

AAAA 1 
BBBB1 1 
BBBB2 1 
CCCC 3 

AAAA 1 
BBBB 1 
BBBB 1 
CCCC 3 

C'est, la première est correcte, alors que dans le second, le champ est correctement raccourci mais le groupe est erroné .

Quelqu'un a-t-il éclairé ce sujet?

Andrew

+0

SQLite n'est pas LINQ to SQL, n'est-ce pas? Cela ressemble à un mais dans le fournisseur LINQ to SQLite. Je vous suggère de regarder le SQL généré ... –

+0

Le SQL généré n'est probablement pas correct pour SQLite. Le regroupement est probablement effectué avant la troncature de la clé. Pouvez-vous poster ce qui est généré? – dlev

+0

Merci à tous les deux - il s'avère que c'est un bug - ajouter un AsEnumerable() et forcer le groupe à se faire localement est un correctif. – amaca

Répondre

0

Quel connecteur utilisez-vous pour votre LINQ à SQLite? Il semble que ce soit un bug dans ce connecteur.

par exemple. En regardant la table de révision pour dotconnect - http://www.devart.com/dotconnect/sqlite/revision_history.html - alors il y a beaucoup de groupes par bogues qu'ils ont trouvés et corrigés ces derniers mois - et je suis sûr qu'il pourrait y en avoir d'autres là-dedans.


Sauf si vous avez absolument besoin sqlite, alors vous pourriez envisager de passer à SQL CE - dans ce cas, vous obtiendrez un soutien plus direct pour LINQ de Microsoft.

+0

Merci Stuart - Je suis obligé d'utiliser Sqlite dans ce cas. – amaca