{"id":268,"date":"2023-04-30T08:34:10","date_gmt":"2023-04-30T07:34:10","guid":{"rendered":"https:\/\/crispycode.net\/?p=268"},"modified":"2023-05-14T10:08:59","modified_gmt":"2023-05-14T09:08:59","slug":"odata-rezepte","status":"publish","type":"post","link":"https:\/\/crispycode.net\/de\/odata-rezepte\/","title":{"rendered":"Praktische OData Rezepte"},"content":{"rendered":"<div class=\"bd-thopjeou9a6ovpkt4kwjkh8uwfh10f wp-block-bd--- wp-block-bd-block-44\"><img decoding=\"async\" src=\"https:\/\/crispycode.net\/wp-content\/uploads\/2023\/05\/alexander-bartz.90x90.jpg\" alt=\"Profilbild Alexander Bartz\" class=\"bd-20hqmwgfd45ft6le7o9jodfn5s4wdr\"><div class=\"bd-h521mx4v22cf4pnhdltwg5jsfoh993\"><span class=\"bd-q4ar1wk0pskc0416tjc7mqgzja7qdd\">Alexander Bartz<\/span><span class=\"bd-ykmon322dena208dhdzhgf1giiesgg\">soft-evolution GmbH &amp; CO KG<\/span><a title=\"LinkedIn Profil Alexander Bartz\" href=\"https:\/\/www.linkedin.com\/in\/alexander-bartz-soft-evolution\/\" class=\"bd-a4t6wfzl4e6eqgll7rkjmpmu1ii5k0\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/crispycode.net\/wp-content\/uploads\/2023\/05\/linkedin.png\" alt=\"LinkedIn Logo\" class=\"bd-defoi8wzogf1iq3dwx1b54vft4y5fp\"><\/a><\/div><\/div>\n\n\n<p>Standards sind eine tolle Sache &#8211; wenn sie einem tats\u00e4chlich Arbeit abnehmen. Leider gibt es selten etwas geschenkt, weshalb es in der Praxis immer wichtig ist Kosten und Nutzen gegeneinander abzuw\u00e4gen. Dieser Beitrag soll beide Seiten kurz und knapp beleuchten um dir ein schnelles Abw\u00e4gen zu erm\u00f6glichen. Wenn dann die Vorteile f\u00fcr deinen Anwendungsfall \u00fcberwiegen, findest du hier gleich einsatzfertige L\u00f6sungen in Form von OData Rezepten &#8211; copy &amp; paste ready \ud83d\ude09<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\"><h2>Inhalt<\/h2><nav><ul><li class=\"\"><a href=\"#was-ist-o-data\">Was ist OData?<\/a><\/li><li class=\"\"><a href=\"#nachteile-von-o-data\">Nachteile von OData<\/a><\/li><li class=\"\"><a href=\"#vorteile-von-o-data\">Vorteile von OData<\/a><\/li><li class=\"\"><a href=\"#rezept-1-ein-minimaler-o-data-fahiger-api-endpunkt\">Rezept 1: Ein minimaler OData f\u00e4higer API Endpunkt<\/a><\/li><\/ul><\/nav><\/div>\n\n\n\n<div style=\"height:52px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"was-ist-o-data\">Was ist OData?<\/h2>\n\n\n\n<p>Das halten wir mal ganz kurz: OData steht f\u00fcr Open Data Protocol. Der Standard wurde zwar von Microsoft initiiert, ist aber inzwischen ein ISO zertifizierter Standard, der auch au\u00dferhalb des Microsoft Universums Anwendung findet. <\/p>\n\n\n\n<p>Der wichtigste Teil des Protokolls ich eine Abfragesprache (\u00e4hnlich wie SQL) mit der Daten selektiert werden k\u00f6nnen. Zum Einsatz kommt das in der Regel um an einem Client im Web (z.B. in JavaScript oder C# programmiert) eine Abfrage geben eine REST API zu formulieren. Eine solche OData REST API antwortet dann in einem wohl definierten Format, so dass der Client die gelieferten Daten verwenden kann.<\/p>\n\n\n\n<p>Neben der Abfragesprache h\u00e4ngt an OData noch viel mehr. Z.B. werden alle verwendeten Datentype definiert und k\u00f6nnen von der API abgerufen werden. Au\u00dferdem kann eine vollst\u00e4ndige OData Implementierung auch daf\u00fcr genutzt werden Daten zu manipulieren.<\/p>\n\n\n\n<p>Das soll jetzt aber erstmal f\u00fcr einen ganz groben \u00dcberblick reichen. Wer sich grundlegend \u00fcber alle M\u00f6glichkeiten informieren will, dem sei die Site <a href=\"https:\/\/www.odata.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">odata.org<\/a> empfohlen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"nachteile-von-o-data\">Nachteile von OData<\/h2>\n\n\n\n<p>Der gr\u00f6\u00dfte Nachteil ist meiner Meinung nach, dass man sich etwas <strong>in die Thematik einarbeiten<\/strong> muss. Wer also schon ein eine gute Vorlage in der Schublade hat, und jetzt vor einem weiteren Projekt steht, der kann wahrscheinlich am besten nochmal in die Schublade greifen und auch das n\u00e4chste Projekt wie gehabt umsetzen.<\/p>\n\n\n\n<p>Weiterhin ist nat\u00fcrlich die Einhaltung von Standards immer auch an <strong>gewisse Einschr\u00e4nkungen<\/strong> gebunden. Hier zeigt sich OData jedoch sehr flexibel. Es ist keine Alles-oder-Nichts-L\u00f6sung. Ich kann mir die Teile herauspicken, die mir n\u00fctzen und den Rest gepflegt ignorieren.<\/p>\n\n\n\n<p>Dar\u00fcber hinaus bringt ein Protokoll auch <strong>etwas Overhead<\/strong> mit sich. Das sollte nur kurz erw\u00e4hnt sein. F\u00fcr den API Endpunkt auf den tausende von Requests einh\u00e4mmern, kann man, wie gesagt, sich dann aus OData ausklinken und eine ganz tolle Highspeed Schnittstelle erfinden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"vorteile-von-o-data\">Vorteile von OData<\/h2>\n\n\n\n<p>Der gr\u00f6\u00dfte Vorteil, den eine standardisierte Abfragesprache mit sich bringt ist ganz klar, dass man Vieles <strong>nicht mehr selbst erfinden<\/strong> muss. F\u00fcr die Clientseite gibt es eine Reihe von Anbietern, die m\u00e4chtige Data-Grids anbieten. Von DevExpress gibt es eine L\u00f6sungen f\u00fcr <a href=\"https:\/\/js.devexpress.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">JavaScript <\/a>und f\u00fcr Blazor gibt es fertige Komponenten von <a href=\"https:\/\/www.radzen.com\/documentation\/blazor\/odata\/\" target=\"_blank\" rel=\"noreferrer noopener\">Radzen (kostenlos)<\/a> und von <a href=\"https:\/\/docs.telerik.com\/blazor-ui\/knowledge-base\/grid-odata\" target=\"_blank\" rel=\"noreferrer noopener\">Telerik<\/a>.<\/p>\n\n\n\n<p>Vereinfacht kann man also sagen, dass man nur eine fertige Komponente in den Client legt und automatisch von allem profitiert, was f\u00fcr die Darstellung gro\u00dfer Datenmenge wichtig ist. Man w\u00e4lzt halt am besten alles, was mit gro\u00dfen Datenmenge zu tun direkt auf die Datenbank ab (Filtern und Sortieren). Die Zig Millionen von Datens\u00e4tzen lassen wir also sch\u00f6n das Problem des Datenbanksystems sein und holen sie weder in den Hauptspeicher des Webservers noch \u00fcbertragen wir sie zum Client.<\/p>\n\n\n\n<p>Und das Beste kommt erst noch: Nachdem wir die Arbeit f\u00fcr die Abfrage und Darstellung der Daten am Client schon wegrationalisiert haben, stellen wir uns noch kurz die Frage: &#8222;Wie kommt die Abfrage in die Datenbank?&#8220;. Und auch hier gibt es zum Gl\u00fcck nahezu <strong>vollst\u00e4ndige Unterst\u00fctzung von Entity Framework bzw. Entity Framework Core<\/strong>.<\/p>\n\n\n\n<p>Was Entity Framework Core (Kurz EF Core) ist, kann ich im Rahmen dieses Artikels nicht erkl\u00e4ren. Wenn bei dem Begriff gar nichts klingelt, dann nur kurz so viel: Es ist ein ORM (Object Relational Mapper) von Microsoft. Es sorgt also daf\u00fcr, den Bruch zwischen Relationaler Datenbank und objektorientierter Programmierung etwas zu gl\u00e4tten. Eine kleine <a href=\"https:\/\/dd.countit.at\/tutorials\/csharp\/entity-framework\" target=\"_blank\" rel=\"noreferrer noopener\">Einf\u00fchrung in deutsch findest du z.B. hier<\/a>.<\/p>\n\n\n\n<p>Wer EF Core bereits im Einsatz hat oder zumindest kennt (oder die Wissenl\u00fccke gleich mit beseitigen will), kann direkt mit den folgenden Rezepten durchstarten:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"rezept-1-ein-minimaler-o-data-fahiger-api-endpunkt\">Rezept 1: Ein minimaler OData f\u00e4higer API Endpunkt<\/h2>\n\n\n\n<p>Um einen OData-f\u00e4higen Endpunkt in ASP.NET 6 zu erstellen, m\u00fcssen wir zuerst das NuGet-Paket <code>Microsoft.AspNetCore.OData<\/code> installieren und dann den Endpunkt in unserer Anwendung konfigurieren.<\/p>\n\n\n\n<p>Jetzt k\u00f6nnen wir die OData-Dienste und Endpunkte in der <code>Program.cs<\/code> konfigurieren:<\/p>\n\n\n<div class=\"wp-block-prettycode-code  \">\n  <header class=\"prettycode-header\">\n    <div class=\"prettycode-lang is-lang-c#\">\n      C#    <\/div>\n    <div class=\"prettycode-file\">\n      program.cs    <\/div>\n  <\/header>\n  <textarea\n    class=\"prettycode-source\"\n    name=\"codemirror-1066101913\"\n    id=\"codemirror-1066101913\"\n  >using System.Linq;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\nusing Microsoft.OData.Edm;\nusing Microsoft.OData.ModelBuilder;\n\nvar builder = WebApplication.CreateBuilder(args);\n\n\/\/ F\u00fcgen Sie den OData-Dienst hinzu.\nbuilder.Services.AddOData();\n\n\/\/ F\u00fcgen Sie den DbContext und die Datenbankverbindung hinzu.\nbuilder.Services.AddDbContext&lt;YourDbContext&gt;(options =&gt; options.UseSqlServer(&quot;YourConnectionString&quot;));\n\nvar app = builder.Build();\n\n\/\/ Erstellen Sie das OData-Modell.\nIEdmModel GetEdmModel()\n{\n    var odataBuilder = new ODataConventionModelBuilder();\n    odataBuilder.EntitySet&lt;YourEntity&gt;(&quot;YourEntities&quot;);\n    return odataBuilder.GetEdmModel();\n}\n\nif (app.Environment.IsDevelopment())\n{\n    app.UseDeveloperExceptionPage();\n}\n\n\/\/ Verwenden Sie OData.\napp.UseRouting();\napp.UseEndpoints(endpoints =&gt;\n{\n    endpoints.MapODataRoute(&quot;odata&quot;, &quot;odata&quot;, GetEdmModel());\n});\n\napp.Run();<\/textarea>\n  <script>\n    CodeMirror.fromTextArea( document.getElementById('codemirror-1066101913'), {\n      mode: 'clike',\n      readOnly: true,\n      theme: 'darcula',\n      lineNumbers: true,\n      firstLineNumber: 1,\n      matchBrackets: true,\n      indentUnit: 4,\n      tabSize: 4,\n      lineWrapping: true,\n    } );\n  <\/script>\n<\/div>\n\n\n\n<p>Jetzt brauchen wir noch eine Beispiel Entity und einen DbContext<\/p>\n\n\n<div class=\"wp-block-prettycode-code  \">\n  <header class=\"prettycode-header\">\n    <div class=\"prettycode-lang is-lang-c#\">\n      C#    <\/div>\n    <div class=\"prettycode-file\">\n      YourDbContext.cs    <\/div>\n  <\/header>\n  <textarea\n    class=\"prettycode-source\"\n    name=\"codemirror-2004895173\"\n    id=\"codemirror-2004895173\"\n  >public class YourEntity\n{\n    public int Id { get; set; }\n    public string Name { get; set; }\n}\n\npublic class YourDbContext : DbContext\n{\n    public YourDbContext(DbContextOptions&lt;YourDbContext&gt; options)\n        : base(options)\n    {\n    }\n\n    public DbSet&lt;YourEntity&gt; YourEntities { get; set; }\n}<\/textarea>\n  <script>\n    CodeMirror.fromTextArea( document.getElementById('codemirror-2004895173'), {\n      mode: 'clike',\n      readOnly: true,\n      theme: 'darcula',\n      lineNumbers: true,\n      firstLineNumber: 1,\n      matchBrackets: true,\n      indentUnit: 4,\n      tabSize: 4,\n      lineWrapping: true,\n    } );\n  <\/script>\n<\/div>\n\n\n\n<p>Wir ersetzen &#8222;YourEntity&#8220;, &#8222;YourDbContext&#8220; und &#8222;YourConnectionString&#8220; durch entsprechende Werte, die zu unserer Anwendung passen. Schon haben wir einen OData-f\u00e4higen Endpunkt erstellt, der unter <code>\/odata\/YourEntities<\/code> erreichbar ist. Der Endpunkt unterst\u00fctzt nun OData-Abfrageoptionen wie <code>$filter<\/code>, <code>$select<\/code>, <code>$expand<\/code>, <code>$orderby<\/code>, <code>$skip<\/code> und <code>$top<\/code>.<\/p>\n\n\n\n<p><\/p>\n<div class=\"shariff\"><ul class=\"shariff-buttons theme-default orientation-horizontal buttonsize-medium\"><li class=\"shariff-button facebook shariff-nocustomcolor\" style=\"background-color:#4273c8\"><a href=\"https:\/\/www.facebook.com\/sharer\/sharer.php?u=https%3A%2F%2Fcrispycode.net%2Fde%2Fodata-rezepte%2F\" title=\"Bei Facebook teilen\" aria-label=\"Bei Facebook teilen\" role=\"button\" rel=\"nofollow\" class=\"shariff-link\" style=\"; background-color:#3b5998; color:#fff\" target=\"_blank\"><span class=\"shariff-icon\" style=\"\"><svg width=\"32px\" height=\"20px\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 18 32\"><path fill=\"#3b5998\" d=\"M17.1 0.2v4.7h-2.8q-1.5 0-2.1 0.6t-0.5 1.9v3.4h5.2l-0.7 5.3h-4.5v13.6h-5.5v-13.6h-4.5v-5.3h4.5v-3.9q0-3.3 1.9-5.2t5-1.8q2.6 0 4.1 0.2z\"\/><\/svg><\/span><span class=\"shariff-text\">teilen<\/span>&nbsp;<\/a><\/li><li class=\"shariff-button linkedin shariff-nocustomcolor\" style=\"background-color:#1488bf\"><a href=\"https:\/\/www.linkedin.com\/sharing\/share-offsite\/?url=https%3A%2F%2Fcrispycode.net%2Fde%2Fodata-rezepte%2F\" title=\"Bei LinkedIn teilen\" aria-label=\"Bei LinkedIn teilen\" role=\"button\" rel=\"noopener nofollow\" class=\"shariff-link\" style=\"; background-color:#0077b5; color:#fff\" target=\"_blank\"><span class=\"shariff-icon\" style=\"\"><svg width=\"32px\" height=\"20px\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 27 32\"><path fill=\"#0077b5\" d=\"M6.2 11.2v17.7h-5.9v-17.7h5.9zM6.6 5.7q0 1.3-0.9 2.2t-2.4 0.9h0q-1.5 0-2.4-0.9t-0.9-2.2 0.9-2.2 2.4-0.9 2.4 0.9 0.9 2.2zM27.4 18.7v10.1h-5.9v-9.5q0-1.9-0.7-2.9t-2.3-1.1q-1.1 0-1.9 0.6t-1.2 1.5q-0.2 0.5-0.2 1.4v9.9h-5.9q0-7.1 0-11.6t0-5.3l0-0.9h5.9v2.6h0q0.4-0.6 0.7-1t1-0.9 1.6-0.8 2-0.3q3 0 4.9 2t1.9 6z\"\/><\/svg><\/span><span class=\"shariff-text\">teilen<\/span>&nbsp;<\/a><\/li><li class=\"shariff-button mastodon shariff-nocustomcolor\" style=\"background-color:#563ACC\"><a href=\"https:\/\/s2f.kytta.dev\/?text=Praktische%20OData%20Rezepte https%3A%2F%2Fcrispycode.net%2Fde%2Fodata-rezepte%2F\" title=\"Bei Mastodon teilen\" aria-label=\"Bei Mastodon teilen\" role=\"button\" rel=\"noopener nofollow\" class=\"shariff-link\" style=\"; background-color:#6364FF; color:#fff\" target=\"_blank\"><span class=\"shariff-icon\" style=\"\"><svg width=\"75\" height=\"79\" viewBox=\"0 0 75 79\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M37.813-.025C32.462-.058 27.114.13 21.79.598c-8.544.621-17.214 5.58-20.203 13.931C-1.12 23.318.408 32.622.465 41.65c.375 7.316.943 14.78 3.392 21.73 4.365 9.465 14.781 14.537 24.782 15.385 7.64.698 15.761-.213 22.517-4.026a54.1 54.1 0 0 0 .01-6.232c-6.855 1.316-14.101 2.609-21.049 1.074-3.883-.88-6.876-4.237-7.25-8.215-1.53-3.988 3.78-.43 5.584-.883 9.048 1.224 18.282.776 27.303-.462 7.044-.837 14.26-4.788 16.65-11.833 2.263-6.135 1.215-12.79 1.698-19.177.06-3.84.09-7.692-.262-11.52C72.596 7.844 63.223.981 53.834.684a219.453 219.453 0 0 0-16.022-.71zm11.294 12.882c5.5-.067 10.801 4.143 11.67 9.653.338 1.48.471 3 .471 4.515v21.088h-8.357c-.07-7.588.153-15.182-.131-22.765-.587-4.368-7.04-5.747-9.672-2.397-2.422 3.04-1.47 7.155-1.67 10.735v6.392h-8.307c-.146-4.996.359-10.045-.404-15.002-1.108-4.218-7.809-5.565-10.094-1.666-1.685 3.046-.712 6.634-.976 9.936v14.767h-8.354c.109-8.165-.238-16.344.215-24.5.674-5.346 5.095-10.389 10.676-10.627 4.902-.739 10.103 2.038 12.053 6.631.375 1.435 1.76 1.932 1.994.084 1.844-3.704 5.501-6.739 9.785-6.771.367-.044.735-.068 1.101-.073z\"\/><defs><linearGradient id=\"paint0_linear_549_34\" x1=\"37.0692\" y1=\"0\" x2=\"37.0692\" y2=\"79\" gradientUnits=\"userSpaceOnUse\"><stop stop-color=\"#6364FF\"\/><stop offset=\"1\" stop-color=\"#563ACC\"\/><\/linearGradient><\/defs><\/svg><\/span><span class=\"shariff-text\">teilen<\/span>&nbsp;<\/a><\/li><li class=\"shariff-button pinterest shariff-nocustomcolor\" style=\"background-color:#e70f18\"><a href=\"https:\/\/www.pinterest.com\/pin\/create\/link\/?url=https%3A%2F%2Fcrispycode.net%2Fde%2Fodata-rezepte%2F&media=https%3A%2F%2Fcrispycode.net%2Fwp-content%2Fuploads%2F2023%2F04%2Flots-of-data-streams-flowing-into-a-single-clean-ordered-table-e1682684373331.png&description=Praktische%20OData%20Rezepte\" title=\"Bei Pinterest pinnen\" aria-label=\"Bei Pinterest pinnen\" role=\"button\" rel=\"noopener nofollow\" class=\"shariff-link\" style=\"; background-color:#cb2027; color:#fff\" target=\"_blank\"><span class=\"shariff-icon\" style=\"\"><svg width=\"32px\" height=\"20px\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 27 32\"><path fill=\"#cb2027\" d=\"M27.4 16q0 3.7-1.8 6.9t-5 5-6.9 1.9q-2 0-3.9-0.6 1.1-1.7 1.4-2.9 0.2-0.6 1-3.8 0.4 0.7 1.3 1.2t2 0.5q2.1 0 3.8-1.2t2.7-3.4 0.9-4.8q0-2-1.1-3.8t-3.1-2.9-4.5-1.2q-1.9 0-3.5 0.5t-2.8 1.4-2 2-1.2 2.3-0.4 2.4q0 1.9 0.7 3.3t2.1 2q0.5 0.2 0.7-0.4 0-0.1 0.1-0.5t0.2-0.5q0.1-0.4-0.2-0.8-0.9-1.1-0.9-2.7 0-2.7 1.9-4.6t4.9-2q2.7 0 4.2 1.5t1.5 3.8q0 3-1.2 5.2t-3.1 2.1q-1.1 0-1.7-0.8t-0.4-1.9q0.1-0.6 0.5-1.7t0.5-1.8 0.2-1.4q0-0.9-0.5-1.5t-1.4-0.6q-1.1 0-1.9 1t-0.8 2.6q0 1.3 0.4 2.2l-1.8 7.5q-0.3 1.2-0.2 3.2-3.7-1.6-6-5t-2.3-7.6q0-3.7 1.9-6.9t5-5 6.9-1.9 6.9 1.9 5 5 1.8 6.9z\"\/><\/svg><\/span><span class=\"shariff-text\">merken<\/span>&nbsp;<\/a><\/li><li class=\"shariff-button twitter shariff-nocustomcolor\" style=\"background-color:#595959\"><a href=\"https:\/\/twitter.com\/share?url=https%3A%2F%2Fcrispycode.net%2Fde%2Fodata-rezepte%2F&text=Praktische%20OData%20Rezepte\" title=\"Bei X teilen\" aria-label=\"Bei X teilen\" role=\"button\" rel=\"noopener nofollow\" class=\"shariff-link\" style=\"; background-color:#000; color:#fff\" target=\"_blank\"><span class=\"shariff-icon\" style=\"\"><svg width=\"32px\" height=\"20px\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path fill=\"#000\" d=\"M14.258 10.152L23.176 0h-2.113l-7.747 8.813L7.133 0H0l9.352 13.328L0 23.973h2.113l8.176-9.309 6.531 9.309h7.133zm-2.895 3.293l-.949-1.328L2.875 1.56h3.246l6.086 8.523.945 1.328 7.91 11.078h-3.246zm0 0\"\/><\/svg><\/span><span class=\"shariff-text\">teilen<\/span>&nbsp;<\/a><\/li><\/ul><\/div>","protected":false},"excerpt":{"rendered":"<p>Praktische OData Rezepte: Kosten-Nutzen-Analyse von Standards und einsatzfertige L\u00f6sungen f\u00fcr optimale Anwendungsf\u00e4lle \u2013 alles copy &#038; paste ready!<\/p>\n","protected":false},"author":1,"featured_media":276,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[22],"tags":[],"class_list":["post-268","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programmierung"],"uagb_featured_image_src":{"full":["https:\/\/crispycode.net\/wp-content\/uploads\/2023\/04\/lots-of-data-streams-flowing-into-a-single-clean-ordered-table-e1682684373331.png",940,399,false],"thumbnail":["https:\/\/crispycode.net\/wp-content\/uploads\/2023\/04\/lots-of-data-streams-flowing-into-a-single-clean-ordered-table-e1682684373331-150x150.png",150,150,true],"medium":["https:\/\/crispycode.net\/wp-content\/uploads\/2023\/04\/lots-of-data-streams-flowing-into-a-single-clean-ordered-table-e1682684373331-300x127.png",300,127,true],"medium_large":["https:\/\/crispycode.net\/wp-content\/uploads\/2023\/04\/lots-of-data-streams-flowing-into-a-single-clean-ordered-table-e1682684373331-768x326.png",768,326,true],"large":["https:\/\/crispycode.net\/wp-content\/uploads\/2023\/04\/lots-of-data-streams-flowing-into-a-single-clean-ordered-table-e1682684373331.png",940,399,false],"1536x1536":["https:\/\/crispycode.net\/wp-content\/uploads\/2023\/04\/lots-of-data-streams-flowing-into-a-single-clean-ordered-table-e1682684373331.png",940,399,false],"2048x2048":["https:\/\/crispycode.net\/wp-content\/uploads\/2023\/04\/lots-of-data-streams-flowing-into-a-single-clean-ordered-table-e1682684373331.png",940,399,false]},"uagb_author_info":{"display_name":"Alexander Bartz","author_link":"https:\/\/crispycode.net\/de\/author\/abartz\/"},"uagb_comment_info":2348,"uagb_excerpt":"Praktische OData Rezepte: Kosten-Nutzen-Analyse von Standards und einsatzfertige L\u00f6sungen f\u00fcr optimale Anwendungsf\u00e4lle \u2013 alles copy & paste ready!","_links":{"self":[{"href":"https:\/\/crispycode.net\/de\/wp-json\/wp\/v2\/posts\/268","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/crispycode.net\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/crispycode.net\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/crispycode.net\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/crispycode.net\/de\/wp-json\/wp\/v2\/comments?post=268"}],"version-history":[{"count":3,"href":"https:\/\/crispycode.net\/de\/wp-json\/wp\/v2\/posts\/268\/revisions"}],"predecessor-version":[{"id":278,"href":"https:\/\/crispycode.net\/de\/wp-json\/wp\/v2\/posts\/268\/revisions\/278"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/crispycode.net\/de\/wp-json\/wp\/v2\/media\/276"}],"wp:attachment":[{"href":"https:\/\/crispycode.net\/de\/wp-json\/wp\/v2\/media?parent=268"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/crispycode.net\/de\/wp-json\/wp\/v2\/categories?post=268"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/crispycode.net\/de\/wp-json\/wp\/v2\/tags?post=268"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}