2011-05-21 2 views
1

J'ai précédemment posé la question et j'ai obtenu la réponse à Best approach to write query mais le problème est que si vous devez enregistrer ce résultat dans une liste, il y a duplication des enregistrements. Par exemple la table résultante de la jointure donnée EXAMPLEComment enregistrer les données extraites d'une requête

Voir qu'il y a des lignes dupliquées. Comment pouvez-vous les filtrer, et pourtant enregistrer les données du numéro de commande? Bien sûr, il peut y avoir certaines façons, mais je suis à la recherche de grandes façons

Comment pouvons-nous stocker les données dans la liste et ne pas créer des lignes en double dans la liste?

Mon code actuel pour mes tableaux est

int lastUserId = 0; 
    sql_cmd = new SqlCommand(); 
    sql_cmd.Connection = sql_con; 

    sql_cmd.CommandText = "SELECT * FROM AccountsUsers LEFT JOIN Accounts ON AccountsUsers.Id = Accounts.userId ORDER BY AccountsUsers.accFirstName"; 
    SqlDataReader reader = sql_cmd.ExecuteReader(); 

    if (reader.HasRows == true) 
    { 
     Users userToAdd = new Users(); 

     while (reader.Read()) 
     { 
      userToAdd = new Users(); 
      userToAdd.userId = int.Parse(reader["Id"].ToString()); 
      userToAdd.firstName = reader["accFirstName"].ToString(); 
      userToAdd.lastName = reader["accLastName"].ToString(); 
      lastUserId = userToAdd.userId; 

      Websites domainData = new Websites(); 
      domainData.domainName = reader["accDomainName"].ToString(); 
      domainData.userName = reader["accUserName"].ToString(); 
      domainData.password = reader["accPass"].ToString(); 
      domainData.URL = reader["accDomain"].ToString(); 
      userToAdd.DomainData.Add(domainData); 

      allUsers.Add(userToAdd); 
     } 
    } 

Pour la deuxième table, j'ai une liste personnalisée qui contiendra les entrées de toutes les données dans la deuxième table.

Le tableau retourné est la table ayant des jointures et avoir plusieurs lignes pour même

Répondre

1

En plus d'utiliser l'idée Dictionary répondu par Antonio Bakula ...

Si vous persistez le dictionnaire des utilisateurs et appelez le code dans votre échantillon plusieurs fois, vous devriez considérer qu'un compte utilisateur est soit nouveau, modifed, ou supprimé.

L'algorithme à utiliser est la suivante lors de l'exécution de votre requête SQL:

  1. Si la ligne de résultat de la requête est pas dans le dictionnaire créer et ajouter un nouvel utilisateur au dictionnaire.
  2. Si la ligne dans le résultat de la requête est dans le dictionnaire, mettez à jour les informations de l'utilisateur.
  3. Si l'élément de dictionnaire ne figure pas dans le résultat de la requête, supprimez l'utilisateur du dictionnaire.

Je vous recommande aussi de ne pas utiliser SELECT *
Utilisez uniquement les colonnes de la table de votre besoin de code, ce qui améliore les performances de votre code, et empêche une violation potentielle de sécurité en retournant les informations utilisateur privé.

0

Je mettrais les utilisateurs dans Dictonary et vérifier si existe allready, quelque chose comme ceci:

Dictionary<int, Users> allUsers = new Dictionary<int, Users>() 

puis dans Reader en boucle :

int userId = int.Parse(reader["Id"].ToString()); 
Users currUser = allUsers[userId]; 

if (currUser == null) 
{ 
    currUser = new Users(); 
    currUser.userId = userId); 
    currUser.firstName = reader["accFirstName"].ToString(); 
    currUser.lastName = reader["accLastName"].ToString(); 
    allUsers.Add(userID, currUser); 
} 

Websites domainData = new Websites(); 
domainData.domainName = reader["accDomainName"].ToString(); 
domainData.userName = reader["accUserName"].ToString(); 
domainData.password = reader["accPass"].ToString(); 
domainData.URL = reader["accDomain"].ToString(); 
currUser.DomainData.Add(domainData); 
1

Je ne sais pas pourquoi vous n'utilisez pas la clause distincte dans votre SQL pour récupérer des résultats uniques. aussi ce sera plus rapide. avez-vous regardé en utilisant des hashtables.

+0

pouvez-vous m'aider à me fournir un échantillon? –

0

On dirait que la racine de votre problème se trouve dans votre table de base de données. Lorsque vous avez indiqué des lignes de données en double, dites-vous que vous avez des entrées en double dans la liste ou que vous avez des données en double dans votre tableau?

Donne 2 lignes qui sont en double.

Deux options: D'abord, éviter de tirer des données en double de sql en utilisant une clause distincte comme: select distinct de l'endroit où

Deuxième option comme Antonio mentionné, est de vérifier si la liste a déjà.

La première option est recommandée à moins d'autres raisons.

+0

Je voudrais voir 2 lignes en double pour comprendre où est la duplication. – kheya

+0

Merci .... par exemple le résultat de la jointure gauche donnera des lignes en double entrées S'il vous plaît voir le lien de l'exemple que j'ai tagué –

Questions connexes