2016-04-26 4 views
-1

Мне нужно внедрить многие из многих отношений со словарем и ADO. Вот мой код, и мне нужно сделать компании на клиенте неповторимыми. Невозможно использовать заказ по запросу. Мне нужна помощь! Использование запроса:Словарь многих для многих

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

С чем вам нужна помощь? Разве это не работает, как ожидалось, или вы получаете ошибку, или что ..? Является ли проблема с SQL или кодом или обоими? И почему нельзя использовать ORDER BY? – stuartd

+0

У меня есть задача сделать это без заказа по запросу. Я имею в виду, что я должен сделать это решение настолько быстрым, насколько это возможно для процессора. –

ответ

2

Вы закончили на полпути. Вы по-прежнему транспортируете все эти компании через сеть, обрабатываете их и отбрасываете в конце. Чтобы получить максимальную скорость, выберите каждый элемент только один раз. Разделить, что на три выбирает:

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; 

получить три коллекции данных

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

Остальное зависит от того, что Вы хотите сделать с этим, но у вас есть все данные. Возможно, вам придется добавить некоторую фильтрацию в эти запросы, если они возвратят данные, которые вам не нужны (WHERE EXISTS(...) или даже простая фильтрация JOIN с таблицей ClientCompanies).

Смежные вопросы