verwendetes Datenbanksystem: <sql2008>
Hallo, kann mir da mal jemand auf die Sprünge helfen? Habe eine Tabelle in eienm DataSat. Da sind Datensätze drin, die mehrmals die identische Zeichnungsnummer haben. Ich möchte jetzt aber alle Datensätze, in denen die Zeichnungsnummer nur einmal vorkommt, und dazu auch die andere(n) Spalte mitausgegeben bekommen. Hie rmal ein Versuch von mir (von vielen), aber ich bekomme nur zwei Datensätze, und die Auftragsnummer ist dazu noch identisch.
var ergebnis = dsNeueProgs.Tables[0].AsEnumerable().Select(t => new {Zeichnungsnummer = t["Zeichnungsnummer"], Artikelnummer = t["Auftragsnummer"]}).GroupBy(g => g.Zeichnungsnummer).FirstOrDefault().ToList();
//// Datenausgabe in Window
Window wnd = new Window();
DataGrid dg = new DataGrid() {ItemsSource = ergebnis};
wnd.Content = dg;
wnd.Show();
Gibt es da eine elegante Lösung?
Hallo oehrle,
ich finde LINQ grundsätzlich in Ordnung, jedoch, wenn zu viele Anforderungen zusammenkommen ist es mühsam, ein ellenlanges LINQ-Statement zu lesen als (z.B.) 3 ordentlich benannte Funktionen. Auch, wenn es mehr Code ist.
Daher würde ich vorschlagen: Geh das ganze mal anders an. Mach dir mehrere Funktionen nacheinander. Somit kannst du das Problem sicherlich a) eingrenzen und b) einfacher nachvollziehbar für dich und andere machen.
Oder ist LINQ hier Pflicht?
Liebe Grüsse
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Da ich das mit LinQ nicht sofort hinbekommen habe, mache ich das auch gerade mit einer Schleife und prüfe die Zeichnungsnummer auf nur "einmaliges" vorkommen.
mit LinQ brauche ich bestimmt noch etwas zusätzliches für die Zwischenhaltung der einmalig vorkommenden Zeichnungsnummer (let oder so). Werde auch nochmal nachforschen, aber muss das zuerst so voran bringen.
Evtl. sieht aber jemand sofort die Lösung.
Hallo oehrle,
var ergebnis = dsNeueProgs.Tables[0].AsEnumerable().Select(t => new {Zeichnungsnummer = t["Zeichnungsnummer"], Artikelnummer = t["Auftragsnummer"]}).GroupBy(g => g.Zeichnungsnummer).FirstOrDefault().ToList();
Du gibst hier auch nur die erste Gruppe zurück, die Du findest, und die hat zufällig zwei Einträge. Und deine Beschränkung auf 1 vergisst Du ganz.
Dein Lambda müsste ungefähr so aussehen (ungetestet):
var ergebnis = dsNeueProgs.Tables[0].AsEnumerable().Select(t => new {Zeichnungsnummer = t["Zeichnungsnummer"], Artikelnummer = t["Auftragsnummer"]}).GroupBy(g => g.Zeichnungsnummer).Where(group=> group.Count() == 1).SelectMany(group => group);
Gruß
Habe gerade getestet. Bekomme zwar Ergebnisse, ist aber die gleiche Anzahl der Datensätze. Ich müßte aus der Gruppierung immer nur den Datensatz erhalten, bei der die Gruppierung nur einen Datensatz enthält. das funktioniert aber so nicht. MMhhh, ist bestimmt nicht viel, mmhh.
Hallo,
also der code von unconnected sieht gut aus. Habs eben auch mal (ohne dataset) getestet und der code sollte schon das machen was du willst.
Hier mein Test:
static void Main(string[] args)
{
var items = new List<dynamic>();
items.Add(new { Zeichnungsnummer = "ABC", Auftragsnummer = 1 });
items.Add(new { Zeichnungsnummer = "XYZ", Auftragsnummer = 1 });
items.Add(new { Zeichnungsnummer = "ABC", Auftragsnummer = 2 });
var res = items.GroupBy(f => f.Zeichnungsnummer).Where(f => f.Count() == 1).SelectMany(f => f).ToArray();
}
Hier krieg ich das item mit der Zeichnungsnummer "XYZ", und auch nur das eine.
Vllt Zufall das Du jetzt gerade 2 Datensätze bekommst die WIRKLICH nur group Count 1 haben? Wieviele Datensätze erwartest Du denn?
Ich gehe mit ca. 1800 Datensätzen rein und es müßten 180 übrig bleiben. Bei meiner herkömmlichen Abarbeitung kommt das auch raus. Nach dem obigen Vorschlag werden 359 Datensätze ausgegeben und es sind doppelte Zeichnungsnummerm vorhanden.
Also ich behaupte mal das der Code Funktioniert, Zumal ich das nicht das erste mal einsetze. Ist Auftragsnummer ein integer? Vllt spaces oder sonstige nicht sichbare Zeichen dran? Was kommt raus wenn Du Dir 2 Datensätze mit 2 gleichen AUftragsnummern aus der Ergebnismenge holst und mit == die Auftragsnummer vergleichst?
Oder lass es einfach wie es ist 😉