Laden...

Linq-Abfrage zur Rückgabe des immer ersten Datensatzes aus einer Gruppierung

Erstellt von oehrle vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.037 Views
O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 11 Jahren
Linq-Abfrage zur Rückgabe des immer ersten Datensatzes aus einer Gruppierung

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?

2.207 Beiträge seit 2011
vor 11 Jahren

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

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 11 Jahren

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.

849 Beiträge seit 2006
vor 11 Jahren

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ß

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 11 Jahren

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.

S
417 Beiträge seit 2008
vor 11 Jahren

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.

849 Beiträge seit 2006
vor 11 Jahren

Vllt Zufall das Du jetzt gerade 2 Datensätze bekommst die WIRKLICH nur group Count 1 haben? Wieviele Datensätze erwartest Du denn?

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 11 Jahren

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.

849 Beiträge seit 2006
vor 11 Jahren

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 😉