2016-04-26 5 views
-1

辞書とADOとの関係を多面的にする必要があります。 ここに私のコードがあり、クライアント上で企業を反復不可能にする必要があります。これは、クエリでオーダーbyを使用することはできません。助けてよろしくお願いします! クエリの使用:辞書を多対多にする

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; 

が、残りはあなたがそれで何をしたいかに依存して3つのデータ収集

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

を取得するには、しかし、あなたは、すべてのデータを用意して:3つの選択にそれを分割します。あなたが必要としないデータ(WHERE EXISTS(...)、さらにはJOINのテーブルなどの簡単なフィルタリングさえも)を返す場合、それらのクエリにいくつかのフィルタリングを追加する必要があります。

関連する問題