2011-05-18 4 views
2

J'ai une requête linq de deux bases de données, cependant, chaque fois que le programme s'arrête au point de requête. Je ne sais pas comment déboguer linq en utilisant VS. Quelqu'un peut-il m'aider à comprendre ce qui ne va pas ici? Je vous remercie.requête linq à partir de deux bases de données

public List<Promotion> GetBroder(string source) 
     { 
      string _connString = ConfigurationManager.AppSettings["DB1"]; 
      PromotionDataContext dc = new PromotionDataContext(_connString); 
      string connString = ConfigurationManager.AppSettings["DB2"]; 
      ReachDirectDataContext RDdc = new ReachDirectDataContext(connString); 
      return (from b in RDdc.BrokerNos 
        from p in dc.Promotions 
        where p.Source == source && p.Broker == b.BrokerNo1 
        select new Promotion() {Code=p.Code,BrokerName=b.Name}).ToList<Promotion>(); 
     } 
+0

Quel type de technologie d'accès aux données que vous utilisez (Ex? EF + Linq-to-entities) –

+1

linq aux entités –

Répondre

1

Vous pouvez utiliser ce qui suit pour afficher le code SQL généré pour l'instruction Linq.

ReachDirectDataContext RDdc = new ReachDirectDataContext(connString); 

RDdc.Log = Console.Out; 

return (from b in RDdc.BrokerNos 
     from p in dc.Promotions  
     where p.Source == source && p.Broker == b.BrokerNo1 
     select new Promotion() {Code=p.Code,BrokerName=b.Name}).ToList<Promotion>(); 

Vous pouvez essayer ce qui suit pour séparer les requêtes.

var promotions = from p in dc.Promotions 
       where p.Source == source 
       select p; 

var brokers = from o in promotions 
       join b in RDdc.BrokerNos on o.Broker equals b.BrokerNo1 
       select new Promotion 
       { 
        Code = o.Code, 
        BrokerName = b.Name 
       }; 
return brokers.ToList(); 
+0

La déconnexion indique 'System.InvalidOperationException', mais je ne vois aucune erreur de syntaxe ici –

+0

Pouvez-vous confirmer que vous êtes en mesure de sélectionner à partir des deux bases de données avec SQL? Dans SQL, vous allez faire une requête en 3 parties (database.schema. table) exécutée dans une base de données. Je ne suis pas sûr de ce que fera Linq. Vous pouvez essayer ce que je vais ajouter ci-dessus dans Modifier. – Leons

+0

@Leons J'ai essayé votre code, il sort avec une erreur "La requête contient des références à des éléments définis sur un contexte de données différent". Une idée? –

2

Votre instruction linq semble correcte. Pour aider au débogage, je trouve utile d'assigner la requête linq à une variable locale, puis de retourner la variable locale. Vous pouvez ensuite définir un point d'arrêt sur l'instruction return et lorsque le débogueur s'arrête au point d'arrêt, vous pouvez inspecter la variable locale de la requête pour voir son contenu, de manière interactive. Vous pouvez utiliser la fenêtre Locals dans VS ou la fenêtre Immediate pour naviguer dans les variables de votre application et voir ce qui se passe. En particulier, vérifiez que les entrées de votre requête linq fournissent effectivement des données. Vérifiez que RDdc.Brokernos n'est pas vide, et dc.Promotions, etc. Si elles sont vides, le résultat sera vide. Suivez votre bug "en amont".

Point secondaire: Vous n'avez pas besoin de spécifier le paramètre type dans l'appel .ToList() dans select. Le compilateur déduira automatiquement le type.

0

Le double de l'air suspect pour moi. (Ce n'est pas l'équivalent de la déclaration de SQL JOIN, si c'est ce que vous visiez.)

Si vous pouvez combiner les contextes:

Essayez de créer la relation entre BrokerNos et promotions à edmx et en utilisant la propriété de navigation en requête.

Par exemple:

var result = dc.Promotions.Where(p => p.Source == source). 
    Select(p => new Promotion() { 
     Code = p.Code, 
     BrokerName = p.Broker.Name, // use new navigation property here 
    }); 

Si non (intersection sera fait en mémoire, pas sur DB !!!:

var result1 = dc.Promotions.Where(p => p.Source == source). 
    Select(p => new Promotion() { 
     Code = p.Code, 
     BrokerId = p.BrokerId, // add id property for intermediate results 
    }).ToList(); 

var result2 = RDdc.Brokers.ToList(); 

var finalResult = result1.Where(p => result2.Contains(b => b.BrokerId == p.BrokerId)).Select(p => new Promotion{ 
     Code = p.Code, 
     BrokerName = result2.Single(b => b.BrokerId == p.BrokerId).Name, 
    }); 
+0

Les deux dataContexts sont-ils identiques à la même instance de serveur de base de données? - Si oui, peut-être créer un edmx qui les utilise tous les deux et les intègre. Ensuite, ouvrez un contexte à celui-ci. Voir ce lien: http://blogs.msdn.com/b/adonet/archive/2008/11/25/working-with-large-models-in-entity-framework-part-1.aspx –

+0

Le nom du courtier doit être tracée à partir d'une autre table de base de données BrokerNo.Name –

+0

Oui, même serveur de base de données mais base de données différente. –

Questions connexes