 <p>First, you are checking if the object instance is in the collection, but you are only creating one instance once (outside the while loop). Therefore, when you check if <code>!myPartyGroupList.Contains(partyGroup)</code>, it will return false the first time, so you will add the obj to the collection and then it will return false every time.</p> <p>I would use a Dictionary using an Id property as the Dictionary key.</p> <p>like this:</p> <pre><code>Dictionary &lt;int,PartyGroup&gt; myPartyGroupList = new Dictionary &lt;int,PartyGroup&gt;(); using (AseDataReader reader = command.ExecuteReader()) { while (reader.Read()) { int id=Convert.ToInt32(reader["party_group_id"]); if (!myPartyGroupList.ContainsKey( id )) { PartyGroup partyGroup = new PartyGroup(); partyGroup.PartyGroupID = id; partyGroup.PartyGroupName = reader["party_group_name"].ToString(); partyGroup.PersonList = myPersonList; myPartyGroupList.Add(id, partyGroup); // key, value? check param order here } } } </code></pre>