字典多对多

Dictionary Many To Many

我需要用字典和 ADO 实现多对多关系。 这是我的代码,我需要让客户上的公司 non-repeatable.It 不允许在查询中使用 order 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;
        }

你中途结束了。你还是把那些公司全部通过网络运输,加工处理,最后扔掉。要获得最大速度,请只获取每个项目一次。将其分成三个选择:

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

剩下的取决于你想用它做什么,但你有所有可用的数据。如果它们 return 您不需要的数据(WHERE EXISTS(...) 或什至使用 ClientCompanies table 或简单过滤 JOIN 或其他)。