2016-04-26 6 views
-1

Ich muss viele zu viele Beziehung mit Wörterbuch und ADO zu glätten. Hier ist mein Code und ich muss Unternehmen auf Client nicht wiederholbar machen. Es ist nicht erlaubt, Reihenfolge von in Abfrage zu verwenden. Ich brauche Hilfe, danke! Verwenden von Abfrage:Wörterbuch viele zu viele

string Query= "SELECT c.ID, c.FirstName, c.LastName, 
         c.EGN, c.Birthday, 
         com.ID as CompanyID, 
         com.Name, 
         com.Location 
       FROM Clients c 
       LEFT JOIN ClientCompanies cc 
       ON c.ID=cc.ClientID 
       LEFT JOIN Company com ON cc.CompanyID=com.ID"; 



     static List<Client> GetClients(SqlCommand command) 
    { 
     List<Client> listClients = new List<Client>(); 
     Dictionary<int, Client> dicClients = new Dictionary<int, Client>(); 
     Dictionary<int, Company> dicCompanies = new Dictionary<int, Company>(); 
     using (SqlDataReader reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       Client newClient = null; 
       Company newCompany = null; 
       int clientId = (int)reader["ID"]; 

       dicClients.TryGetValue(clientId, out newClient); 
       if (newClient == null) 
       { 
        newClient = new Client(); 
        newClient.ID = (int?)reader["ID"]; 
        newClient.FirstName = (!reader.IsDBNull(reader.GetOrdinal("FirstName")) ? (string)reader["FirstName"] : null); 
        newClient.LastName = (!reader.IsDBNull(reader.GetOrdinal("LastName")) ? (string)reader["LastName"] : null); 
        newClient.EGN = (!reader.IsDBNull(reader.GetOrdinal("EGN")) ? (string)reader["EGN"] : null); 
        newClient.Birthday = (!reader.IsDBNull(reader.GetOrdinal("Birthday")) ? (string)reader["Birthday"] : null); 
       } 

       int companyId = (!reader.IsDBNull(reader.GetOrdinal("CompanyID")) ? (int)reader["CompanyID"] : 0); 

       //Some check with dictionary 

       if (newCompany == null) 
       { 
        newCompany = new Company(); 
        newCompany.ID = (!reader.IsDBNull(reader.GetOrdinal("CompanyID")) ? (int?)reader["CompanyID"] : null); 
        newCompany.Name = (!reader.IsDBNull(reader.GetOrdinal("Name")) ? (string)reader["Name"] : null); 
        newCompany.Location = (!reader.IsDBNull(reader.GetOrdinal("Name")) ? (string)reader["Name"] : null); 
        newClient.ClientTo.Add(newCompany); 
       } 

       dicClients[clientId] = newClient; 
      } 
      listClients = dicClients.Values.ToList(); 
      return listClients; 
     } 
+0

Wofür brauchen Sie Hilfe? Funktioniert es nicht wie erwartet, oder erhalten Sie einen Fehler oder was? Ist das Problem mit dem SQL oder dem Code oder beiden? Und warum kann ORDER BY nicht verwendet werden? – stuartd

+0

Ich habe Aufgabe, es ohne Reihenfolge durch in Abfrage zu machen. Ich meine, ich muss diese Lösung so schnell wie möglich für CPU machen. –

Antwort

2

Sie endete auf halbem Weg. Du transportierst all diese Firmen immer noch durch das Netzwerk, verarbeitest sie und wirfst sie am Ende weg. Um die maximale Geschwindigkeit zu erreichen, hole jeden Gegenstand nur einmal. Split, dass in drei wählt:

SELECT c.ID, c.FirstName, c.LastName, c.EGN, c.Birthday FROM Clients c; 
SELECT com.ID as CompanyID, com.Name, com.Location FROM Company com; 
SELECT cc.ClientID, cc.CompanyID FROM ClientCompanies cc; 

drei Datensammlungen zu erhalten

Dictionary<int, Client> dicClients 
Dictionary<int, Company> dicCompanie 
List<Tuple<int, int>> listClientCompanies 

Der Rest hängt davon ab, was Sie wollen damit zu tun, aber Sie haben alle Daten zur Verfügung. Sie müssen möglicherweise einige Filter in diese Abfragen hinzufügen, wenn sie Daten zurückgeben, die Sie nicht benötigen (WHERE EXISTS(...) oder sogar einfache Filterung JOIN mit ClientCompanies Tabelle oder andere).