2010-11-26 7 views
0

J'ai un scénario où j'ai une table de "lot" et une table de "test" où "test" contient un FK à "batch" et de nombreux tests peuvent appartenir à un lot.débordement de pile LINQ sélectionnant plusieurs

Je veux être en mesure de sélectionner plusieurs lots et de trouver tous les tests qui leur appartiennent. Je le fais en produisant une liste de clés primaires aux lots que je suis intéressé, puis la requête LINQ suivante:

var ret = 
from t in tests 
from b in indices //indices is a list of long PK's belonging to selected batches 
where t.batch_id == b 
select t; 

Il fonctionne, mais quand ma taille de sélection dépasse 14 lots, je reçois une « erreur SQLite analyseur stack overflow "sur l'expression LINQ quel que soit le nombre de tests trouvés.

Je veux être en mesure de gérer de grandes sélections si possible. Comment puis-je faire ceci?

+2

Quelqu'un l'a étiqueté comme LinqToSql. Pouvez-vous confirmer? Si ce n'est pas le cas, veuillez modifier les tags. En outre - puisque vous obtenez une erreur Sqlite, cela vous dérangerait-il de poster le sql qui a été envoyé à la base de données? (Utilisez DataContext.Log = Console.Out, si vous utilisez linq to sql.) –

+0

LINQ to SQL ne fonctionne pas avec SQLite – DamienG

+0

Probablement en utilisant LINQ to ADO.NET en utilisant le fournisseur SQLite ADO.net. sql tag a été supprimé et ajouté sqlite et ado.net –

Répondre

0

Le fournisseur LINQ est peut-être en train d'exploser car il tente d'émettre une requête par index. Vous pouvez vérifier cela (si SQL est en fait généré) en profilant la base de données et en vérifiant si elle émet réellement une requête par index.

Essayez ceci:

var ret = 
from t in tests 
where indices.Contains(t.batch_id) 
select t; 
1

Si la requête de JeffN825 ne résout pas votre problème, que je donnerais cote élevée à ce faire, vous devrez peut-être compiler votre propre SQLite et définissez la valeur de -DYYSTACKDEPTH à quelque chose de plus grand que le défaut. Donc, vous aurez besoin de savoir à quoi il était destiné et ensuite peut-être le doubler et partir de là. La ligne complète que vous passeriez est CFLAGS="-DYYSTACKDEPTH=1000" en changeant le 1000 pour être à quelle profondeur vous voulez que la pile soit.

Questions connexes