{"id":55000097,"date":"2017-08-01T00:00:00","date_gmt":"2020-03-27T19:27:51","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=97"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"LINQ_to_EntitiesBeispiele_in_der_Methodensyntax","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/LINQ_to_EntitiesBeispiele_in_der_Methodensyntax\/","title":{"rendered":"LINQ to Entities-Beispiele in der Methodensyntax"},"content":{"rendered":"<p><b>LINQ to Entities ist die Abfragesprache f&uuml;r den Zugriff auf Daten in den Entit&auml;ten eines Entity Data Models. Im vorliegenden Artikel sehen wir uns einige Beispiele f&uuml;r den Zugriff per LINQ auf die Daten unserer Beispielanwendung &#8220;Bestellverwaltung&#8221; an. Dabei verwenden wir in diesem Artikel die Methoden-Syntax von LINQ.<\/b><\/p>\n<h2>Voraussetzungen<\/h2>\n<p>F&uuml;r die hier vorgestellten Beispiele verwenden wir das Entity Data Model der Anwendung <b>Bestellverwaltung<\/b>. Die Ergebnisse sollen jeweils in einem DataGrid ausgegeben werden. Dazu erstellen wir ein neues Fenster namens <b>LINQBeispiele<\/b>, dessen Entwurf wie in Bild 1 aussieht. Die Definition ist einfach gehalten. Die wichtigsten Elemente ist das Kombinationsfeld <b>cboBeispiele<\/b>, mit dem Sie die Beispiele ausw&auml;hlen k&ouml;nnen, die wir anschlie&szlig;end per C#-Code zum Code behind-Modul hinzuf&uuml;gen, sowie das <b>DataGrid<\/b>-Steuerelement <b>db<\/b>, welches das Ergebnis der jeweiligen Abfrage anzeigen soll. Das <b>ComboBox<\/b>-Steuerelement ist an die Eigenschaft <b>Beispiele <\/b>gebunden und l&ouml;st das Ereignis <b>SelectionChanged <\/b>aus:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_97_001.png\" alt=\"Fenster zur Ausgabe der Beipiele\" width=\"424,7115\" height=\"315,5843\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Fenster zur Ausgabe der Beipiele<\/span><\/b><\/p>\n<pre>&lt;Window x:Class=\"Bestellverwaltung.LINQBeispiele\"\r\n         Title=\"LINQBeispiele\" Height=\"300\" Width=\"400\"&gt;\r\n     &lt;Grid&gt;\r\n         ... Grid-Definition ...\r\n         &lt;StackPanel Grid.Column=\"0\" Grid.ColumnSpan=\"2\" Orientation=\"Horizontal\"&gt;\r\n             &lt;Label Margin=\"5\"&gt;LINQ-Beispiel:&lt;\/Label&gt;\r\n             &lt;ComboBox x:Name=\"cboBeispiele\" Margin=\"5\" Width=\"200\" SelectionChanged=\"cboBeispiele_SelectionChanged\" \r\n                 ItemsSource=\"{Binding Beispiele}\"&gt;&lt;\/ComboBox&gt;\r\n         &lt;\/StackPanel&gt;\r\n         &lt;DataGrid x:Name=\"dg\" Grid.Row=\"1\" Grid.Column=\"0\" Grid.ColumnSpan=\"2\" Margin=\"5\"&gt;&lt;\/DataGrid&gt;\r\n         &lt;Button x:Name=\"btnOK\" Grid.Row=\"2\" Margin=\"5\" Width=\"50\" Click=\"btnOK_Click\"&gt;OK&lt;\/Button&gt;\r\n     &lt;\/Grid&gt;\r\n&lt;\/Window&gt;<\/pre>\n<p>In der Code behind-Klasse erstellen wir ein Datenbank-Kontext-Objekt mit Zugriff auf das Entity Data Model sowie eine <b>ObservableCollection<\/b>, welche die Liste der Beispiele f&uuml;r das Kombinationsfeld enth&auml;lt:<\/p>\n<pre>BestellverwaltungEntities dbContext = new BestellverwaltungEntities();\r\nprivate ObservableCollection&lt;string&gt; beispiele;\r\npublic ObservableCollection&lt;string&gt; Beispiele {\r\n     get { return beispiele; }\r\n     set { beispiele = value; }\r\n}<\/pre>\n<p>In der Konstruktor-Methode erstellen wir die <b>ObservableCollection <\/b>und f&uuml;llen diesem mit Eintr&auml;gen wie hier am Beispiel <b>Alle Kunden<\/b>:<\/p>\n<pre>public LINQBeispiele() {\r\n     InitializeComponent();\r\n     beispiele = new ObservableCollection&lt;string&gt;();\r\n     beispiele.Add(\"Alle Kunden\");\r\n     DataContext = this;\r\n}<\/pre>\n<p>F&uuml;r das konkrete Beispiel, alle Kunden anzuzeigen, definieren wir auch wieder eine <b>ObservableCollection<\/b>:<\/p>\n<pre>private ObservableCollection&lt;Kunde&gt; kunden;\r\npublic ObservableCollection&lt;Kunde&gt; Kunden {\r\n     get { return kunden; }\r\n     set { kunden = value; }\r\n}<\/pre>\n<p>Diese wird schlie&szlig;lich gef&uuml;llt und angezeigt, wenn der Benutzer den Eintrag <b>Alle Kunden <\/b>aus dem Kombinationsfeld ausw&auml;hlt. Dies l&ouml;st das Ereignis <b>SelectionChanged<\/b> aus, f&uuml;r das wir die folgende Ereignismethode hinterlegt haben:<\/p>\n<pre>private void cboBeispiele_SelectionChanged(object sender, SelectionChangedEventArgs e) {\r\n     ComboBox cbo = (ComboBox)sender;\r\n     string beispiel = (string)cbo.SelectedItem;\r\n     switch (beispiel) {\r\n         case \"Alle Kunden\":\r\n             kunden = new ObservableCollection&lt;Kunde&gt;(dbContext.Kunden);\r\n             dg.ItemsSource = Kunden;\r\n             break;\r\n         default:\r\n             break;\r\n     }\r\n}<\/pre>\n<p>F&uuml;r den Eintrag <b>Alle Kunden <\/b>f&uuml;llt die Methode nun die <b>ObservableCollection <\/b>namens <b>kunden <\/b>mit den &uuml;ber den LINQ-Ausdruck <b>dbContext.Kunden <\/b>ermittelten Kunden. Die Eigenschaft <b>Kunden <\/b>wird dann noch dem DataGrid <b>dg <\/b>zugewiesen, damit dieses die Kundenliste wie in Bild 2 anzeigt. Das DataGrid ist ja flexibel, das hei&szlig;t, Sie k&ouml;nnen ihm beliebige Auflistungen zuweisen. Wir f&uuml;gen daher, wenn wir in den folgenden Beispielen andere <b>ObservableCollections <\/b>als <b>Kunden <\/b>nutzen, einfach entsprechende neue ObservableCollections hinzu und weisen die entsprechende Collection der Eigenschaft <b>ItemsSource <\/b>des <b>DataGrid<\/b>-Elements zu.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_97_002.png\" alt=\"Ausgabe aller Kunden des Entity Data Models\" width=\"599,593\" height=\"325,3347\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Ausgabe aller Kunden des Entity Data Models<\/span><\/b><\/p>\n<h2>Alle Elemente einer Klasse<\/h2>\n<p>Das erste Beispiel haben Sie ja schon kennengelernt. Um alle Elemente einer Klasse beziehungsweise Auflistung zu liefern, brauchen Sie diese einfach nur gemeinsam mit dem <b>dbContext<\/b>-Objekt als Inhalt der neuen ObservableCollection anzugeben:<\/p>\n<pre>kunden = new ObservableCollection&lt;Kunde&gt;(dbContext.Kunden);<\/pre>\n<p>Dies liefert alle Elemente der <b>Kunden<\/b>-Auflistung des Entity Data Models. Alle Elemente von anderen Klassen k&ouml;nnen Sie ebenso leicht holen, dazu m&uuml;ssen Sie nur die entsprechende <b>ObservableCollection <\/b>definieren und dem DataGrid zuweisen. Wenn Sie nun also alle Produkte ausgeben wollen, legen Sie erst eine neue ObservableCollection samt privater und &ouml;ffentlicher Variable an:<\/p>\n<pre>private ObservableCollection&lt;Produkt&gt; produkte;\r\npublic ObservableCollection&lt;Produkt&gt; Produkte {\r\n     get { return produkte; }\r\n     set { produkte = value; }\r\n}<\/pre>\n<p>Dann f&uuml;gen Sie einen neuen Eintrag zur <b>ComboBox <\/b>hinzu:<\/p>\n<pre>public LINQBeispiele() {\r\n     ...\r\n     beispiele.Add(\"Alle Produkte\");\r\n     ...\r\n}<\/pre>\n<p>Schlie&szlig;lich noch der neue <b>case<\/b>-Zweig in der <b>switch<\/b>-Bedingung:<\/p>\n<pre>case \"Alle Produkte\":\r\n     produkte = new ObservableCollection&lt;Produkt&gt;(dbContext.Produkte);\r\n     dg.ItemsSource = Produkte;\r\n     break;<\/pre>\n<p>Damit k&ouml;nnen wir uns nun in den folgenden Beispielen auf die LINQ-Ausdr&uuml;cke konzentrieren.<\/p>\n<h2>Sortieren von Elementen<\/h2>\n<p>Zum Sortieren nutzen wir die <b>OrderBy<\/b>&#8211; oder die <b>OrderByDescending<\/b>-Methode. Letztere ist f&uuml;r die absteigende Sortierung verantwortlich. Der folgende Ausdruck liefert alle Kunden, aufsteigend sortiert nach den Nachnamen:<\/p>\n<pre>dbContext.Kunden.OrderBy(d =&gt; d.Nachname)<\/pre>\n<p>Wenn Sie die Kunden absteigend nach den Nachnamen sortieren wollen, verwenden Sie <b>OrderByAscending<\/b>:<\/p>\n<pre>dbContext.Kunden.OrderByDescending(d =&gt; d.Nachname)<\/pre>\n<p>F&uuml;r Sortierungen nach verschiedenen Feldern in der gleichen Abfrage verwenden Sie <b>OrderBy<\/b>\/<b>OrderByDescending<\/b>&#8211; gefolgt von einem oder mehreren Aufrufen der <b>ThenBy<\/b>\/<b>ThenByDescending<\/b>-Methode. Wenn Sie also zuerst nach dem Nachnamen und dann nach dem Vornamen sortieren wollen, verwenden Sie den folgenden Ausdruck:<\/p>\n<pre>dbContext.Kunden.OrderBy(d =&gt; d.Nachname).ThenBy(d =&gt; d.Vorname)<\/pre>\n<p>Man k&ouml;nnte f&auml;lschlicherweise meinen, zwei aufeinanderfolgende Aufrufe der <b>OrderBy<\/b>-Methode w&uuml;rden die Aufgabe auch erledigen. Das ist aber mitnichten der Fall. Die folgende Abfrage sortiert n&auml;mlich erst nach dem Vornamen und dann nach dem Nachnamen &#8211; allerdings wird die erste Sortierung beim Ausf&uuml;hren der zweiten verworfen, sodass auch bei mehreren gleichen Nachnamen die Datens&auml;tze nur zuf&auml;llig richtig nach dem Vornamen sortiert sein d&uuml;rften:<\/p>\n<pre>dbContext.Kunden.OrderBy(d =&gt; d.Vorname).OrderBy(d =&gt; d.Nachname)<\/pre>\n<p>Der folgende Ausdruck sortiert aufsteigend nach den Nachnamen und absteigend nach dem Vornamen:<\/p>\n<pre>dbContext.Kunden.OrderBy(d =&gt; d.Nachname).ThenByDescending(d =&gt; d.Vorname)<\/pre>\n<h2>Filtern nach einzelnen Feldern<\/h2>\n<p>Wenn Sie Daten etwa nach dem Inhalt eines Feldes filtern wollen, k&ouml;nnen Sie das mit der <b>Where<\/b>-Methode erledigen. Das folgende Beispiel liefert etwa alle Kunden, deren Feld <b>Nachname <\/b>den Wert <b>M&uuml;ller <\/b>enth&auml;lt:<\/p>\n<pre>dbContext.Kunden.Where(d =&gt; d.Nachname == \"M&uuml;ller\")<\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000097\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000097?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000097\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"123b777de9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>LINQ to Entities ist die Abfragesprache f&uuml;r den Zugriff auf Daten in den Entit&auml;ten eines Entity Data Models. Im vorliegenden Artikel sehen wir uns einige Beispiele f&uuml;r den Zugriff per LINQ auf die Daten unserer Beispielanwendung &#8220;Bestellverwaltung&#8221; an. Dabei verwenden wir in diesem Artikel die Methoden-Syntax von LINQ.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662017,66042017,44000008,44000021],"tags":[],"yst_prominent_words":[],"class_list":["post-55000097","post","type-post","status-publish","format-standard","hentry","category-662017","category-66042017","category-Datenzugriffstechnik","category-Entity_Framework"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000097","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000097"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000097\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000097"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000097"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000097"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000097"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}