---
title: "Datareader uttagande av data som skall hamna rätt..."
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/147026-datareader-uttagande-av-data-som-skall-hamna-rätt"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "Dino"
published: "2006-05-17T19:14:07.000Z"
updated: "2006-05-18T09:00:00.000Z"
replies: 2
views: 241
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/147026-datareader-uttagande-av-data-som-skall-hamna-rätt"
---

# Datareader uttagande av data som skall hamna rätt...

## #1 — Dino, 2006-05-17T19:14Z

... nåja, har i alla fall dessa classer.

```
public class Root
{
   public List<Parent> Items;
}

public class Parent
{
   public int Id;
   public int Type;
   public List<Child> Childs;
}

public class Child
{
   public int Id;
   public int ParentId;
   public string Title;
}
```

Sen en sql fråga som returnerar data som nedan.

```
ParentId      Type   ChildId      Title
2             100       1            Size 1 
2             100       3            Size 4 
2             100       8            Size 2 
2             100       23           Size 3 
6             200       4            Color 2
6             200       5            Color 1 
6             200       2            Color 3
7             300       12           Some text
```

Eftersom min hjärncell försöker lära sig binda blommor så jag skulle jag behöva lite hjälp med logiken för att se till att datan hamnar på rätt ställe. 
Något så här:
Per rader med samma dr\["ParentId"\] så skall på den första raden en Parent(Parent.Id, Parent.Type) skapas. Och den radens Child (Child.Id, Child.Title) skall läggas till i Parent.Childs. Nästkommande rader med samma dr\[ParentId"\] skall skapa en Child som skall läggas till i den aktuella Parent.Childs. 
När det sen blir ett nytt dr\["ParentId"\] så skall Parent läggas till i Root.Items och sen en loop på detta beteende.

```
Root r = new Root();

while (dr.Read())
{
   Parent p = new Parent();
   p.Id = Convert.ToInt32(dr["ParentId"]);
   p.Type = Convert.ToInt32(dr["Type"]);
   Child c = new Child();
   c.Id = Convert.ToInt32(dr["ChildId"]);
   c.Title = Convert.ToString(dr["Title"]);
   pa.Childs.Add(c);

   //And somewhere add to root
   r.Items.Add(p);
}
```

Permalänk: https://www.webforum.nu/p/147026

## #2 — emission, 2006-05-17T22:02Z

Strukturen känns mäkta konstig, men...

```
Root r = new Root();
int lastParentId=0;
Parent p;
while (dr.Read())
{
	int parentId=Convert.ToInt32(dr["ParentId"]);
	if (parentId>lastParentId)
	{
		p = new Parent();
		p.Id = Convert.ToInt32(dr["ParentId"]);
		p.Type = Convert.ToInt32(dr["Type"]);
		r.Items.Add(p);
	}
	lastParentId=Convert.ToInt32(dr["ParentId"]);
	Child c = new Child();
	c.Id = Convert.ToInt32(dr["ChildId"]);
	c.Title = Convert.ToString(dr["Title"]);
	p.Childs.Add(c);
}
```

Förutsatt att parentId listas stigande och childId är unikt.

PS. Child i plural heter Children :) DS

Permalänk: https://www.webforum.nu/p/1818079

## #3 — Dino, 2006-05-18T09:00Z

Kom på en lösning i natt som fungerade. Om den är den optimala är väl tveksamt, men den får duga för nu.

```
Root r = new Root();
Dictionary<int, Parent> col = new Dictionary<int, Parent>();
int x = 0;
while (dr.Read())
{
   int parentid = Convert.ToInt32(dr["ParentId"]);
   Parent p = new Parent();
   p.Id = parentid;
   p.Type = Convert.ToInt32(dr["Type"]);
   Child c = new Child();
   c.Id = Convert.ToInt32(dr["ChildId"]);
   c.Title = Convert.ToString(dr["Title"]);
   p.Items.Add(c);

   if (x != parentid )
   {
      x = parentid;
      col.Add(x, p);
   }
   else
   {
      col[x].Items.Add(c);
   }                  
}
r.Items.AddRange(col.Values);
```

Permalänk: https://www.webforum.nu/p/1818151

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/147026-datareader-uttagande-av-data-som-skall-hamna-rätt
