2011-06-18 7 views
4

je reçois l'erreur suivante lorsque vous essayez de joindre un tableau à la requête Linq à EFRejoignez tableau à EF requête

Une erreur est survenue lors de l'exécution de la définition de la commande. Voir l'exception interne pour plus de détails. Une partie de votre instruction SQL est imbriquée trop profondément. Réécrivez la requête ou divisez-la en plus petites requêtes.

Le code est le suivant:

var vids = new List<string>(); 
using (var ctx = new MyDbContext()) 
{ 
    var qry = ctx.Pickups.Where(p => p.UserName == User.Identity.Name); 
    if (someBoolean) 
    { 
     var v = GetVids(); // get the list of Ids from a web service 
     vids.AddRange(v); 
    } 
    if (vids.Count() > 0) 
    { 
     qry = qry.Join(vids, p => p.VId, v => v, (v, p) => p); 
    } 
    var data = qry 
     .Select(p => new 
     { 
      // etc. 
     }); 
} 

Le problème est que le service Web est pas associé à la DB J'utilise EF avec, sinon, je venais de faire la jonction contre la tables dans la base de données. Le nombre d'ID que je reçois du service Web pourrait être supérieur à une centaine (généralement 5-10). Si je commente la jointure, le code fonctionne bien, donc je sais que l'erreur est dans la jointure. Avec seulement quelques ID (jusqu'à environ 30) dans vids, la jointure fonctionne parfaitement.

Que recommandez-vous pour remédier à ce problème? La seule chose à laquelle je pouvais penser était d'insérer la liste des ID dans la base de données et de faire la jointure de cette façon. Cela ne me semble pas trop attirant.

+0

Je pense que le problème n'est pas avec les parties du code que vous avez fourni –

Répondre

5

Essayez de remplacer if (vids.Count() > 0) avec:

if (vids.Count > 0) 
{ 
    qry = qry.Where(arg => vids.Contains(arg.VId)); 
} 

Cela ne fonctionnera que si vids est moins de 2100 éléments, comme cela se traduira à IN (x, y, .., n) condition. Si vous utilisez la structure d'entité 3.5, Contains ne fonctionnera pas. Vous pouvez trouver la solution possible ici: 'Contains()' workaround using Linq to Entities?

+0

J'utilise EF 4.0, donc je vais bien. Changé la jointure à l'endroit que vous avez décrit et cela fonctionne très bien. N'aura jamais plus que quelques centaines, donc ça devrait marcher. Ahh, les joies de faire face à deux systèmes disparates et d'être moi-même l'agrégateur. –