Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Hilfe bei LINQ Abfrage
AnTri
myCSharp.de - Member



Dabei seit:
Beiträge: 119

Themenstarter:

Hilfe bei LINQ Abfrage

beantworten | zitieren | melden

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")
private Nachricht | Beiträge des Benutzers
chrismoe
myCSharp.de - Member



Dabei seit:
Beiträge: 52

beantworten | zitieren | melden



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"));
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von chrismoe am .
private Nachricht | Beiträge des Benutzers
schaedld
myCSharp.de - Member

Avatar #avatar-2533.jpg


Dabei seit:
Beiträge: 1.433
Herkunft: Schweiz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
chrismoe
myCSharp.de - Member



Dabei seit:
Beiträge: 52

beantworten | zitieren | melden

Lol, den Gedanken hatte ich auch - und diesmal war ich schneller ;)
Und da sieht man mal wieder, dass viele Wege nach Rom führen...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von chrismoe am .
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 5.940
Herkunft: Zentralschweiz

beantworten | zitieren | melden

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

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers
schaedld
myCSharp.de - Member

Avatar #avatar-2533.jpg


Dabei seit:
Beiträge: 1.433
Herkunft: Schweiz

beantworten | zitieren | melden

Zitat von Peter Bucher
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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von schaedld am .
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 5.940
Herkunft: Zentralschweiz

beantworten | zitieren | melden

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

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers
schaedld
myCSharp.de - Member

Avatar #avatar-2533.jpg


Dabei seit:
Beiträge: 1.433
Herkunft: Schweiz

beantworten | zitieren | melden

Zitat von Peter Bucher
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
private Nachricht | Beiträge des Benutzers
AnTri
myCSharp.de - Member



Dabei seit:
Beiträge: 119

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
schaedld
myCSharp.de - Member

Avatar #avatar-2533.jpg


Dabei seit:
Beiträge: 1.433
Herkunft: Schweiz

beantworten | zitieren | melden

Eventuell ein guter Einstiegspunkt: LINQ Sample --> vgl. Join
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt
private Nachricht | Beiträge des Benutzers
AnTri
myCSharp.de - Member



Dabei seit:
Beiträge: 119

Themenstarter:

beantworten | zitieren | melden

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???
private Nachricht | Beiträge des Benutzers
Jdam
myCSharp.de - Member



Dabei seit:
Beiträge: 257

beantworten | zitieren | melden

Ich denke was dir fehlt ist distinct.

.Select(p => p.GetLieferanten()).Distinct().ToList<string>()
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 2.891

beantworten | zitieren | melden

Zitat von Jdam
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
private Nachricht | Beiträge des Benutzers
AnTri
myCSharp.de - Member



Dabei seit:
Beiträge: 119

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers