2016-08-08 10 views
0

I 2 Datentabellen mit folgenden Datensätze in -Datensatz habe:Wie Gruppierung nach Datatabelle mit Beziehung zwischen 2 Datentabellen definieren?

dtVariant:

Name  Type  status 
Variant1 Add   active 
Variant2 Division  active 

dtSubVariant:

Name  Type   SubvariantName 
Variant1 Add   Sub1 
Variant1 Add   Sub2 
Variant1 Add   Sub3 
Variant2 Division  Sub1 
Variant2 Division  Sub2 
Variant2 Division  sub3 
Variant2 Division  sub4 

Jetzt möchte ich Subvarianten Liste erhalten, indem Variante Typ und nur diese Varianten deren Status aktiv ist wie folgt:

Add:Sub1,Sub2,Sub3 

Division:Sub1,Sub2,Sub3,Sub4 

Hier habe ich die Beziehung zwischen Säulen bauen Name and Type zwischen diesen zwei Datentabellen wie unten:

Ds1.Relations.Add("MyRelation", dtVariant, dtSubVariant, false); 

Abfrage:

var data = (from c in Ds1.Tables["dtVariant"].AsEnumerable() 
    .where c.Field<string>("status")=="active" 
      group c by new { Type = c.Field<string>("Type") } into grp  
      select new 
      { 
       Type= grp.Key.Type, 
        Names= 
       from dp in c.GetChildRows("MyRelation")//Not getting this method 
      }).ToList(); 

Aber wenn Ich versuche, dies zu tun:

from dp in c.GetChildRows("MyRelation") //i am not getting this GetChildRows method. 

Kann mir jemand dabei helfen ??

Antwort

1

Dieses Zeug ist, was Linq für ...

var result = Ds1.Tables["dtVariant"].AsEnumerable().GroupBy(i => i.Type); 
+0

meine Frage aktualisiert. Vergessen, Statusfeld in Variante datatable.sorry –

+0

einzuschließen Meine Antwort hat sich nicht geändert, weil basierend auf der Frage dies immer noch die Lösung ist, oyu möchte eine WHERE-Klausel nach dem AsEnumerable() hinzufügen, aber das löst noch Ihr Problem. – War

2
var result = Ds1.Tables["dtSubVariant"].AsEnumerable() 
      .GroupBy(i => i.Type) 
      .select(x=>new 
        { 
        Type= i.Key.Type, 
        SubVariantList=i.Select(x=>x.SubvariantName).ToArray() 
        }).ToList(); 

Sie haben alle Informationen in dtSubVariant gebaut wurde, und Sie können diese Abfrage, um es verwenden.

+0

Ich habe meine Frage mit etwas change.forgotten aktualisiert, um Status field.sorry einzuschließen –

1

Es scheint nicht, wie Sie Ihre Beziehung richtig einstellen, aber es könnte ein bisschen schneller, ohne es sein:

string[] activeTypes = Ds1.Tables["dtVariant"].Rows.Cast<DataRow>() 
    .Where(r => r["status"] == "active").Select(r => r["Type"] + "").ToArray(); 

var data = Ds1.Tables["dtSubVariant"].Rows.Cast<DataRow>() 
    .GroupBy(r => r["Type"] + "") 
    .Where(g => activeTypes.Contains(g.Key)) 
    .Select(g => new { 
     Type = g.Key, 
     Names = g.ToList() 
    }).ToList(); 
Verwandte Themen