webForumDet fria alternativet

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

.NET

2 svar · 233 visningar · startad av Dino

Medlem sedan sep. 20011 914 inlägg
Frågan#1

... 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);
}
Medlem sedan dec. 19996 721 inlägg
#2

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

Medlem sedan sep. 20011 914 inlägg
#3

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);
365 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
228 ms — ändringar (db)