字典多对多
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
或其他)。
我需要用字典和 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
或其他)。