{"id":55000227,"date":"2020-08-01T00:00:00","date_gmt":"2020-11-26T10:20:05","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=227"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Entity_Framework_Aktionsabfragen_mit_LINQ","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Entity_Framework_Aktionsabfragen_mit_LINQ\/","title":{"rendered":"Entity Framework: Aktionsabfragen mit LINQ"},"content":{"rendered":"<p><b>Wer lange mit Access gearbeitet hat, schreibt Aktionsabfragen entweder mit der Entwurfsansicht f&uuml;r Abfragen oder erstellt diese per SQL-Quellcode. Vielleicht kombinieren Sie auch beide Varianten und passen per Entwurf erstellte Abfragen in der SQL-Ansicht an.  Unter VBA verwendet man au&szlig;erdem oft DAO, um Datensatzgruppen zu &ouml;ffnen und Daten anzulegen, zu bearbeiten oder zu l&ouml;schen. In einem Entity Data Model k&ouml;nnen Sie auch SQL-Abfragen absetzen, sowohl f&uuml;r Auswahl- als auch f&uuml;r Aktionsabfragen. Allerdings gibt es auch LINQ &#8211; die Abfragesprache f&uuml;r das Entity Framework. Dieser Artikel zeigt, wie Sie g&auml;ngige SQL-Aktionsabfragen oder DAO-Aktionen in LINQ &uuml;bersetzen.<\/b><\/p>\n<p><b>Beispieldateien<\/b><\/p>\n<p>Im Download zu diesem Artikel finden Sie einen Ordner mit den Laufzeitdateien der als Beispiel verwendeten Rechnungsverwaltung. Au&szlig;erdem finden Sie in der Datei <b>VonSQLZuLINQ.linq <\/b>alle in diesem Artikel vorgestellten Beispiele.<\/p>\n<p><b>Was ist LINQ<\/b><\/p>\n<p><b>LINQ <\/b>hei&szlig;t <b>Language Integrated Query <\/b>und ist die Abfragesprache f&uuml;r Entity Data Models. Im Gegensatz zu VBA, wo Sie die Abfragen immer in SQL formulieren und als Parameter von Methoden wie <b>OpenRecordset <\/b>(bei Auswahlabfragen) oder <b>Execute <\/b>(bei Aktionsabfragen) angegeben haben, bietet LINQ die direkte Integration in die Sprache Visual Basic (und auch C#).<\/p>\n<p>Im Artikel <b>EF: Daten abfragen mit VB und LINQ <\/b>(<b>www.datenbankentwickler.net\/166<\/b>) haben wir bereits gezeigt, wie Sie Auswahlabfragen mit LINQ und VB realisieren. Nun schauen wir uns an, wie wir Aktionsabfragen unter LINQ abbilden k&ouml;nnen.<\/p>\n<p><b>IntelliSense mit LINQ nutzen<\/b><\/p>\n<p>LINQ bietet gegen&uuml;ber SQL-Abfragen den Vorteil, IntelliSense nutzen zu k&ouml;nnen. Am einfachsten testen k&ouml;nnen wir LINQ-Ausdr&uuml;cke nach wie vor mit dem Tool <b>LINQPad<\/b>. Wir arbeiten hier mit der Version 5. Um auf die Daten einer SQL Server-Datenbank zugreifen zu k&ouml;nnen, richten wir mit folgenden Schritten eine Verbindung ein.<\/p>\n<p>Die einzige Voraussetzung ist, dass es eine <b>.exe <\/b>f&uuml;r das Projekt gibt und dass Sie wissen, wo die Konfigurationsdatei gespeichert ist &#8211; was nach dem Debuggen eines Desktop-Projekts mit Visual Studio aber beides vorhanden ist:<\/p>\n<ul>\n<li>Starten Sie LINQPad 5.<\/li>\n<li>Klicken Sie im linken Bereich auf <b>Add connection<\/b>.<\/li>\n<li>Wechseln Sie im Dialog <b>Choose Datacontext<\/b> aus Bild 1 zum unteren Bereich und w&auml;hlen Sie dort den Eintrag <b>Entity Framework (DbContext V4\/V5\/V6) <\/b>aus und klicken Sie auf <b>Next<\/b>.<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_227_001.png\" alt=\"Einrichten einer Datenquelle mit LINQ\" width=\"649,559\" height=\"450,2841\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Einrichten einer Datenquelle mit LINQ<\/span><\/b><\/p>\n<li>W&auml;hlen Sie im Dialog <b>Entity Framework dbContext Connection <\/b>die Dateien f&uuml;r die Eigenschaften <b>Path to Custom Assembly <\/b>und <b>Path to application config file <\/b>aus. Hier w&auml;hlen Sie die <b>.exe<\/b>-Datei aus, beispielsweise aus dem Ordner <b>Rechnungsverwaltung <\/b>aus dem Download zu diesem Artikel. Nach der Auswahl der ersten Datei werden Sie in einem weiteren Dialog aufgefordert, die Datenbank-Context-Klasse auszuw&auml;hlen.<\/li>\n<li>Anschlie&szlig;end sieht der Dialog <b>Entity Framework DbContext Connection <\/b>wie in Bild 2 aus. Hier k&ouml;nnen Sie mit der Schaltfl&auml;che <b>Test <\/b>noch pr&uuml;fen, ob die Verbindung hergestellt werden kann. Mit dem Aktivieren der Option <b>Remember this connection <\/b>stellen Sie sicher, dass die Verbindung auch beim n&auml;chsten Start von <b>LINQPad <\/b>noch vorhanden ist.<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_227_002.png\" alt=\"Einrichten der Verbindungsinformationen\" width=\"499,6607\" height=\"478,1313\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Einrichten der Verbindungsinformationen<\/span><\/b><\/p>\n<\/ul>\n<p>Der linke Bereich zeigt nun die Entit&auml;ten und Felder der Verbindung an (siehe Bild 3). Mit einem Klick der rechten Maustaste auf eine der Entit&auml;ten &ouml;ffnen Sie ein Kontextmen&uuml;, das bereits einige m&ouml;gliche Befehle f&uuml;r diese Entit&auml;t anzeigt. Klicken Sie einen dieser Eintr&auml;ge an, wird die passende LINQ-Abfrage im Query-Fenster eingef&uuml;gt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_227_003.png\" alt=\"Die Entit&auml;ten der neuen Verbindung\" width=\"374,7455\" height=\"542,3695\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Die Entit&auml;ten der neuen Verbindung<\/span><\/b><\/p>\n<p>Standardm&auml;&szlig;ig zeigt dies nun eine C#-Abfrage an. Wenn Sie m&ouml;chten, dass automatisch VB-Abfragen erstellt werden, &ouml;ffnen Sie mit dem Men&uuml;eintrag <b>Edit|Preferences <\/b>den Optionen-Dialog und stellen Sie auf der Seite <b>Query <\/b>die Option <b>Default Query Language <\/b>auf <b>VBA Expression <\/b>oder <b>VB Statement(s) <\/b>ein.<\/p>\n<p>Damit sind Sie nun auch bereit, eigene LINQ-Abfragen auf Basis der Entit&auml;ten des Entity Data Models abzusetzen. Diese geben Sie einfach auf einer Seite mit dem Wert <b>VB Expression <\/b>im Auswahlfeld <b>Language <\/b>ein. Sie k&ouml;nnen &uuml;brigens in LINQPad den Verweis auf die Context-Klasse des Entity Data Models weglassen.<\/p>\n<p>Ein Zugriff auf die Entit&auml;tslisten kann auch ohne Angabe dieser Klasse erfolgen. Allerdings ist das in Visual Studio nicht m&ouml;glich, sodass wir in den folgenden Beispielen jeweils auf das Objekt <b>dbContext <\/b>zugreifen. Die Deklaration und Initialisierung wollen wir jedoch nur einmal anf&uuml;hren:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>dbContext<span style=\"color:blue;\"> As <\/span>RechnungsverwaltungContext\r\ndbContext = <span style=\"color:blue;\">New<\/span> RechnungsverwaltungContext<\/pre>\n<p><b>Einen Datensatz hinzuf&uuml;gen<\/b><\/p>\n<p>Um einen Datensatz hinzuzuf&uuml;gen, ben&ouml;tigen wir noch nicht einmal einen LINQ-Ausdruck. Wir erstellen einfach ein neues Objekt des gew&uuml;nschten Typs, hier <b>Kunde<\/b>, und weisen diesem die Eigenschaftswerte zu. Dann f&uuml;gen wir das neue <b>Kunde<\/b>-Objekt mit der <b>Add<\/b>-Methode zur Auflistung <b>Kunden <\/b>hinzu und &uuml;bernehmen die &Auml;nderungen durch einen Aufruf der <b>SaveChanges<\/b>-Methode in die Datenbank. Schlie&szlig;lich geben wir als Nachweis des erfolgreichen Anlegens noch den Wert des Prim&auml;rschl&uuml;sselfeldes des neuen Datensatzes aus:<\/p>\n<pre>'###Beispiel 1\r\n'Einen Kunden hinzuf&uuml;gen\r\n<span style=\"color:blue;\">Dim <\/span>dbContext<span style=\"color:blue;\"> As <\/span>RechnungsverwaltungContext\r\ndbContext = <span style=\"color:blue;\">New<\/span> RechnungsverwaltungContext\r\n<span style=\"color:blue;\">Dim <\/span>NeuerKunde<span style=\"color:blue;\"> As <\/span>Kunde\r\nNeuerKunde = <span style=\"color:blue;\">New<\/span> Kunde\r\n<span style=\"color:blue;\">With<\/span> NeuerKunde\r\n     .AnredeID = 1\r\n     .Vorname = \"Andr&eacute;\"\r\n     .Nachname = \"Minhorst\"\r\nEnd <span style=\"color:blue;\">With<\/span>\r\ndbContext.Kunden.Add(NeuerKunde)\r\ndbContext.SaveChanges\r\n<span style=\"color:blue;\">Debug.Print<\/span>(NeuerKunde.ID)<\/pre>\n<p><b>Platzsparende Schreibweise f&uuml;r das Anlegen eines neuen Elements<\/b><\/p>\n<p>Wir k&ouml;nnen ein paar Zeilen Code sparen, wenn wir das Anlegen wie folgt programmieren:<\/p>\n<pre>'###Beispiel 2\r\n'Kunde hinzuf&uuml;gen, Kurzfassung\r\n<span style=\"color:blue;\">Dim <\/span>NeuerKunde<span style=\"color:blue;\"> As <\/span>Kunde\r\nNeuerKunde = <span style=\"color:blue;\">New<\/span> Kunde <span style=\"color:blue;\">With<\/span> {.AnredeID = 1, .Vorname = \"Andr&eacute;\", .Nachname = \"Minhorst\"}\r\ndbContext.Kunden.Add(NeuerKunde)\r\ndbContext.SaveChanges\r\n<span style=\"color:blue;\">Debug.Print<\/span>(NeuerKunde.ID)<\/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\/55000227\/\">\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\/55000227?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\/55000227\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"9cc095fa2e\"\/>\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>Wer lange mit Access gearbeitet hat, schreibt Aktionsabfragen entweder mit der Entwurfsansicht f&uuml;r Abfragen oder erstellt diese per SQL-Quellcode. Vielleicht kombinieren Sie auch beide Varianten und passen per Entwurf erstellte Abfragen in der SQL-Ansicht an.  Unter VBA verwendet man au&szlig;erdem oft DAO, um Datensatzgruppen zu &ouml;ffnen und Daten anzulegen, zu bearbeiten oder zu l&ouml;schen. In einem Entity Data Model k&ouml;nnen Sie auch SQL-Abfragen absetzen, sowohl f&uuml;r Auswahl- als auch f&uuml;r Aktionsabfragen. Allerdings gibt es auch LINQ &#8211; die Abfragesprache f&uuml;r das Entity Framework. Dieser Artikel zeigt, wie Sie g&auml;ngige SQL-Aktionsabfragen oder DAO-Aktionen in LINQ &uuml;bersetzen.<\/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":[662020,66042020,44000034,44000021,44000027,44000031],"tags":[],"yst_prominent_words":[],"class_list":["post-55000227","post","type-post","status-publish","format-standard","hentry","category-662020","category-66042020","category-COMAddIns_programmieren","category-Entity_Framework","category-Excel_programmieren","category-twinBASICProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000227","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=55000227"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000227\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000227"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000227"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000227"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}