Laden...

Hilfe bei LINQ Abfrage

Erstellt von AnTri vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.920 Views
A
AnTri Themenstarter:in
119 Beiträge seit 2009
vor 14 Jahren
Hilfe bei LINQ Abfrage

Hallo ich bin noch ganz am Anfang mit LINQ und habe ein (sicherlich einfaches) Problem. Ich habe folgende Struktur:


//hier ist die Liste die bearbeitet werden soll
List<Artikel> ArtikelListe = new List<Artikel>();


//Hier die Definitionen der Klassen
class Artikel
{
string Name;
...
List<Lieferant> Lieferantenliste = new List<Lieferant>();
}

class Lieferant
{
string Name;
sring ID;
}



Jetzt würde ich gerne mit LINQ mir eine Liste erzeugen lassen, in der alle Artikel vorkommen deren Lieferant z.B. Test1 lautet (also z.B. Lieferant.Name == "Test1")

C
52 Beiträge seit 2010
vor 14 Jahren


var query = from article in articles  //loop über alle artikel
                  from lieferant in articles.GetLieferanten //(also die Property für die Liste der Lieferanten  - loop über alle Lieferant)
                  where lieferant.Name == "Foo" // (Property für name) where bedingung
                  select article; //den artikel selecten



oder eben direkt Lambda, ist kürzer aber weniger lesbar


var query = articles.Where(a=> a.Lieferanten.Any(l=>l.Name == "Foo"));

1.433 Beiträge seit 2006
vor 14 Jahren

Wers noch kürzer liebt, kann mit LAMBDA Expressions dahinter 🙂


Articles.GetLieferanten().Where(a => a.Name == "Foo").Select(a => a).ToList();

Manchmal leserlicher als eine LINQ-Query, aber macht (hoffentlich) dasselbe.

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

C
52 Beiträge seit 2010
vor 14 Jahren

Lol, den Gedanken hatte ich auch - und diesmal war ich schneller 😉
Und da sieht man mal wieder, dass viele Wege nach Rom führen...

5.941 Beiträge seit 2005
vor 14 Jahren

Salute zusammen

Das ".Select(a => a)" ist überflüssig, aber der Kompiler generiert das, wenn keine Projektion vorgenommen wurde.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

1.433 Beiträge seit 2006
vor 14 Jahren

Salute zusammen

Das ".Select(a => a)" ist überflüssig, aber der Kompiler generiert das, wenn keine Projektion vorgenommen wurde.

Gruss Peter

Ich wusste dass noch einer der Korifäen was einzuwenden hat 😁

Na ja, angenommen er möchte nur ein Property in einer Liste haben, dann ist es legitim

 .Select(a => a.Artikelname).ToList<string>() 

zu verwenden.

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

5.941 Beiträge seit 2005
vor 14 Jahren

Salute schaedld

Ja klar, dann ist es ja auch eine Projektion 😃

BTW: Dieses Jahr komme ich nicht an die TechDays...

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

1.433 Beiträge seit 2006
vor 14 Jahren

BTW: Dieses Jahr komme ich nicht an die TechDays...
Gruss Peter

Welchen Experten soll man dann fragen? Schade, schade... 8o

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

A
AnTri Themenstarter:in
119 Beiträge seit 2009
vor 14 Jahren

Hallo,

Vielen Dank für die Antworten klappt prima. Bitte aber noch eine kleine Hilfe....

Gibt es auch eine Anweisung die mir eine Liste aller Lieferanten die (über alle Artikel) vorkommen ausgibt?

1.433 Beiträge seit 2006
vor 14 Jahren

Eventuell ein guter Einstiegspunkt: LINQ Sample --> vgl. Join

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

A
AnTri Themenstarter:in
119 Beiträge seit 2009
vor 14 Jahren

Danke für den Link, leider sehe ich im Moment "vor lauter Bäume den Wald nicht mehr". Muss ich das mit der Group-Anweisung machen???

J
257 Beiträge seit 2008
vor 14 Jahren

Ich denke was dir fehlt ist distinct.

.Select(p => p.GetLieferanten()).Distinct().ToList<string>()
2.891 Beiträge seit 2004
vor 14 Jahren

Ich denke was dir fehlt ist distinct.

Hm, da muss man aber aufpassen, da "Lieferanten" ja sicherlich Referenztypen sind. Die normale Equals-Implementierung auf Referenzgleichheit prüft, macht Distinct manchmal nicht das, was man erwarten würde.

Gruß,
dN!3L

A
AnTri Themenstarter:in
119 Beiträge seit 2009
vor 14 Jahren

Danke für Eure Hilfe,

ich habe mir so beholfen (bisher funktioniert es auch so):


 var list = from c in articles 
                            from d in articles.GetLieferanten 
                            group d by d.Lieferant into lieferantList
                            orderby lieferantList.Count() descending 
                            select lieferantList;

Gibt es da was auszusetzen?