{"id":28875,"date":"2019-04-03T00:00:00","date_gmt":"2019-04-02T22:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=28875"},"modified":"2021-01-13T09:40:40","modified_gmt":"2021-01-13T08:40:40","slug":"mai-fidarsi-di-entity-framework","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/","title":{"rendered":"Mai fidarsi di Entity Framework!"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"28876\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/attachment\/ad91fe80-751b-4d34-a054-0444bfc8545a\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/ad91fe80-751b-4d34-a054-0444bfc8545a.png?fit=1024%2C608&amp;ssl=1\" data-orig-size=\"1024,608\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"ad91fe80-751b-4d34-a054-0444bfc8545a\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/ad91fe80-751b-4d34-a054-0444bfc8545a.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/ad91fe80-751b-4d34-a054-0444bfc8545a.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-28876\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/ad91fe80-751b-4d34-a054-0444bfc8545a.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/ad91fe80-751b-4d34-a054-0444bfc8545a-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/ad91fe80-751b-4d34-a054-0444bfc8545a-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">D&#8217;accordo, il titolo \u00e8 un po&#8217; esagerato e sicuramente il discorso va allargato a tutti gli ORM. Come ogni cosa, bisogna sapere come sono fatti in modo da poterne fare un uso consapevole. Ma \u00e8 stata la prima cosa che mi \u00e8 venuta in mente quando durante una consulenza da un nuovo cliente, ci siamo resi conto che nonostante i nostri sforzi, guardavamo il colpevole sbagliato (Azure in questa circostanza). Ma procediamo con ordine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A seguito dell&#8217;evento Hello Azure DevOps di Napoli (<a href=\"https:\/\/www.blexin.com\/it-IT\/Event\/Hello-Azure-DevOps-5\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.blexin.com\/it-IT\/Event\/Hello-Azure-DevOps-5<\/a>), una delle aziende partecipanti ci ha contattato per chiedere la nostra collaborazione nella migrazione della loro applicazione. Si trattava di una soluzione Windows Form da migrare a tecnologie pi\u00f9 moderne, con i requisiti di essere cross-platform, poter avere una soluzione as-a-service e avere performance accettabili per i loro standard.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Felicissimi della richiesta sono stato da loro e abbiamo pianificato un po&#8217; di giornate di consulenza per la preparazione di un prototipo per testare la fattibilit\u00e0 della migrazione.&nbsp;In particolare, ci siamo concentrati sulla parte per loro pi\u00f9 critica dal punto di vista delle performance: l&#8217;accettazione in una struttura sanitaria. Immaginate lo scenario tipico di quando andate a fare delle analisi specialistiche, dove avete allo sportello gli addetti all&#8217;accettazione e una fila di persone da smaltire il pi\u00f9 velocemente possibile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dal punto di vista tecnologico, si \u00e8 scelto insieme di testare Asp.Net Core per il backend, Angular per il frontend, lasciando SQL Server come database, ma mantenendo la possibilit\u00e0 di poter passare a PostgreSQL. Il tutto ospitabile sia su Azure che on premise, e sia su Windows che su Linux.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Siamo partiti quindi dal back end, con uno dei template standard Asp.Net Core forniti dalla Command Line Interface (CLI).&nbsp;Abbiamo aggiunto anche l&#8217;autenticazione con Asp.Net Identity che, oltre a servirci per la profilazione degli utenti, ci fornisce anche gi\u00e0 un DbContext Entity Framework Core con cui gestire le nostre entit\u00e0. Se avete installato la CLI di .NET Core (<a rel=\"noreferrer noopener\" href=\"https:\/\/dotnet.microsoft.com\/\" target=\"_blank\">https:\/\/dotnet.microsoft.com\/<\/a>), vi basta creare una cartella a vostro piacere e lanciare il seguente comando:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ndotnet new mvc --auth Individual\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Per semplicit\u00e0, concentriamoci su un singolo aspetto del prototipo:&nbsp;la ricerca dell&#8217;anagrafica del paziente. Tipicamente, il paziente arriva all&#8217;accettazione e fornisce il suo nome e\/o il suo cognome. Una cosa abbastanza semplice, immaginatevi una classe cos\u00ec fatta:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic class Paziente\n{\n\u00a0\u00a0\u00a0\u00a0public int Id { get; set; }\n\u00a0\n\u00a0\u00a0\u00a0\u00a0&#x5B;Required]\n\u00a0\u00a0\u00a0\u00a0&#x5B;StringLength(50)]\n\u00a0\u00a0\u00a0\u00a0public string Nome { get; set; }\n\u00a0\n\u00a0\u00a0\u00a0\u00a0&#x5B;Required]\n\u00a0\u00a0\u00a0\u00a0&#x5B;StringLength(50)]\n\u00a0\u00a0\u00a0\u00a0public string Cognome { get; set; }\n\u00a0\n\u00a0\u00a0\u00a0\u00a0public DateTime DataNascita { get; set; }\n\u00a0\n\u00a0\u00a0\u00a0\u00a0&#x5B;Required]\n\u00a0\u00a0\u00a0\u00a0&#x5B;StringLength(16)]\n\u00a0\u00a0\u00a0\u00a0public string CodiceFiscale { get; set; }\n\u00a0\n\u00a0\u00a0\u00a0\u00a0&#x5B;Required]\n\u00a0\u00a0\u00a0\u00a0&#x5B;StringLength(200)]\n\u00a0\u00a0\u00a0\u00a0public string Indirizzo { get; set; }\n\u00a0\n\u00a0\u00a0\u00a0\u00a0&#x5B;Required]\n\u00a0\u00a0\u00a0\u00a0&#x5B;StringLength(6)]\n\u00a0\u00a0\u00a0\u00a0public string CAP { get; set; }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Aggiungiamo la classe all&#8217; ApplicationDbContext:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic class ApplicationDbContext : IdentityDbContext\n{\n\u00a0\u00a0\u00a0\u00a0public DbSet&lt;Paziente&gt; Pazienti { get; set; }\n\u00a0\n\u00a0\u00a0\u00a0\u00a0public ApplicationDbContext(DbContextOptions&lt;ApplicationDbContext&gt; options)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: base(options)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Per simulare il caso peggiore, abbiamo creato una WebApp su Azure su un Service Plan F1 (quello gratuito, per capirci) e un&#8217;istanza Basic di SqlAzure da 4,21 euro al mese (c&#8217;\u00e8 anche un&#8217;instanza free di SqlAzure, ma non volevamo esagerare). Potete fare lo stesso, e tantissimo altro, con una trial gratuita di Azure. Una volta creati i servizi, potete prendere la stringa di connessione al database, ma ricordatevi di aggiungere il vostro IP al firewall, se volete collegarvi al server e fare delle prove locali:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"558\" data-attachment-id=\"28880\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/attachment\/figura01\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura01.png?fit=1524%2C830&amp;ssl=1\" data-orig-size=\"1524,830\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"figura01\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura01.png?fit=1024%2C558&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura01.png?resize=1024%2C558&#038;ssl=1\" alt=\"\" class=\"wp-image-28880\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/figura01-980x534.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/figura01-480x261.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Copiate la stringa di connessione (occhio che username e password non ci sono per sicurezza, ma li avrete scelti voi durante la creazione del servizio):<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"340\" data-attachment-id=\"28882\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/attachment\/figura02\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura02.png?fit=1524%2C506&amp;ssl=1\" data-orig-size=\"1524,506\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"figura02\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura02.png?fit=1024%2C340&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura02.png?resize=1024%2C340&#038;ssl=1\" alt=\"\" class=\"wp-image-28882\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/figura02-980x325.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/figura02-480x159.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">e incollatela nel file appsettings.json:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n{\n\u00a0\u00a0&quot;ConnectionStrings&quot;: {\n\u00a0\u00a0\u00a0\u00a0&quot;DefaultConnection&quot;: &quot;Server=tcp:efcoretest.database.windows.net,1433;Initial Catalog=efcoretest;Persist Security Info=False;User ID={your_username};Password={your_password};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;&quot;\n\u00a0\u00a0},\n\u00a0\u00a0&quot;Logging&quot;: {\n\u00a0\u00a0\u00a0\u00a0&quot;LogLevel&quot;: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;Default&quot;: &quot;Warning&quot;\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0},\n\u00a0\u00a0&quot;AllowedHosts&quot;: &quot;*&quot;\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Non ci resta che creare la Migration di Entity Framework e applicarla al database:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ndotnet ef migrations add Pazienti \ndotnet ef database update\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Ovviamente abbiamo caricato un&nbsp;po&#8217; di dati di test, circa 25000 righe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Qualche piccola nota nel caso usiate un Mac per i test: nel file Startup.cs il provider di default per Entity Framework del template \u00e8 impostato SqlLite, va cambiato in SqlServer:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nservices.AddDbContext&lt;ApplicationDbContext&gt;(options =&gt;\n\u00a0\u00a0\u00a0\u00a0options.UseSqlServer(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Configuration.GetConnectionString(&quot;DefaultConnection&quot;)));\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Se volete testare la connessione al database da Mac potete utilizzare Azure Data Studio (<a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/it-it\/sql\/azure-data-studio\/download?view=sql-server-2017\" target=\"_blank\">https:\/\/docs.microsoft.com\/it-it\/sql\/azure-data-studio\/download?view=sql-server-2017<\/a>): \u00e8 gratuito e noterete subito che \u00e8 molto simile a VSCode!<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"758\" data-attachment-id=\"28886\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/attachment\/figura03\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura03.png?fit=1099%2C814&amp;ssl=1\" data-orig-size=\"1099,814\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"figura03\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura03.png?fit=1024%2C758&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura03.png?resize=1024%2C758&#038;ssl=1\" alt=\"\" class=\"wp-image-28886\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/figura03-1024x758.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/figura03-980x726.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/figura03-480x356.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A questo punto dobbiamo solo aggiungere un controller e fare la nostra query:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic class PazientiController : Controller\n{\n\u00a0\u00a0\u00a0\u00a0private readonly ApplicationDbContext ctx;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0public PazientiController(ApplicationDbContext ctx)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.ctx = ctx;\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0public IActionResult RicercaPazienti(string nome, string cognome)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var results = this.ctx.Pazienti\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Where(x =&gt; x.Nome.StartsWith(nome) &amp;&amp; x.Cognome.StartsWith(cognome))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Take(50)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.ToList();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return Ok(results);\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Funziona, tutti contenti. Peccato che nella applicazione Windows Form, la selezione dell&#8217;anagrafica ha abituato gli utenti ad una user experience basata sulla digitazione del cognome e del nome, con l&#8217;aggiornamento della lista risultati ad ogni cambiamento di uno di questi due parametri. La conseguenza \u00e8 che questa API verr\u00e0 richiamata ad ogni digitazione in uno dei due campi, cosa che abbiamo replicato in Angular.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il risultato \u00e8 che, ovviamente, non otteniamo lo stesso feedback dell&#8217;applicazione originale, e voi direte ok, ci pu\u00f2 stare: passi da un ambiente locale a quello Web, da SQL Server in rete locale al Sql Azure nel Cloud, da una applicazione tutta sul client a una interazione Angular-Asp.Net Core-SqlServer. In teoria, quindi, ci pu\u00f2 stare di perdere qualcosa tra la query e la serializzazione in JSON del risultato. Lo scopo del prototipo era proprio testare queste possibilit\u00e0 e quindi, insieme a Roberto, la persona del team del cliente con cui ho lavorato, abbiamo cominciato a fare degli esperimenti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Siamo partiti dalle cose semplici: scalare il database, passando ad una istanza pi\u00f9 potente e anche pi\u00f9 costosa. La situazione ovviamente migliora, ma non abbastanza. Roberto aggiunge due indici su nome e cognome. La situazione migliora ancora ma non abbastanza. Proviamo a cambiare la UX, spariamo la ricerca alla pressione del tasto invio, risultato pi\u00f9 che accettabile ma non eravamo contenti. C&#8217;era qualcosa che non andava. Roberto, che da anni lavora con i dati e con SQL Server mi fa: &#8220;Michele scusa, mi fai vedere la query che genera Entity Framework?&#8221;. La query \u00e8 facilmente visibile dal log in console:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"202\" data-attachment-id=\"28888\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/attachment\/figura04\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura04.png?fit=1085%2C214&amp;ssl=1\" data-orig-size=\"1085,214\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"figura04\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura04.png?fit=1024%2C202&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura04.png?resize=1024%2C202&#038;ssl=1\" alt=\"\" class=\"wp-image-28888\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/figura04-1024x202.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/figura04-980x193.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/figura04-480x95.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La domanda quindi diventa: perch\u00e9 fa quel tipo di WHERE? Bisogna tener presente che Entity Framework \u00e8 un ORM e la versione Core \u00e8 stata completamente riscritta da zero, per poter supportare alcuni nuovi scenari, come i database in memoria (molto utili per i test automatici) e la gestione di Database non relazionali (lo so, anche io mi chiedo perch\u00e8 dovrei usare un ORM con un database non relazionale). Inoltre LINQ pu\u00f2 essere usato anche in scenari diversi dal database, \u00e8 questo uno dei suoi punti forti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In ogni caso, dopo una ricerca in rete ci siamo resi conto che \u00e8 un problema noto ed \u00e8 in generale legato all&#8217;uso della StartWith() e la Contains() sulle stringhe. Fortunatamente, gli sviluppatori del framework hanno fornito delle funzioni apposite per permetterci di essere pi\u00f9 diretti con LINQ, quando sappiamo di lavorare su un database:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic IActionResult RicercaPazienti(string nome, string cognome)\n{\n\u00a0\u00a0\u00a0\u00a0var results = this.ctx.Pazienti\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Where(x =&gt; EF.Functions.Like(x.Nome, nome + &quot;%&quot;) &amp;&amp; EF.Functions.Like(x.Cognome, cognome + &quot;%&quot;))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Take(50)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.ToList();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0return Ok(results);\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">La query risultante \u00e8 la seguente:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"156\" data-attachment-id=\"28891\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/attachment\/figura05\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura05.png?fit=1089%2C166&amp;ssl=1\" data-orig-size=\"1089,166\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"figura05\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura05.png?fit=1024%2C156&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/figura05.png?resize=1024%2C156&#038;ssl=1\" alt=\"\" class=\"wp-image-28891\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/figura05-1024x156.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/figura05-980x149.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/figura05-480x73.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il risultato \u00e8 impressionante:&nbsp;la velocit\u00e0 percepita dall&#8217;applicazione \u00e8 esattamente quella che volevamo, anchetornando alla versione base di SQL Azure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Morale della favola: quando lavorate con un ORM, sia esso Entity Framework o qualsiasi altro, non perdete mai di vista le query generate. Disabilitate il Lazy Load, impostate manualmente il fetch plan con le Include() quando serve, e misurate, misurate, misurate!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Happy Coding!<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Impariamo a usare gli ORM consapevolmente e con gli occhi aperti.<\/p>\n","protected":false},"author":196716248,"featured_media":28876,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"{title}\n\n{excerpt}\n\n{url}","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[688637374],"tags":[688637414,688637377],"class_list":["post-28875","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-asp-net-core","tag-azure"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Mai fidarsi di Entity Framework! - Blexin<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mai fidarsi di Entity Framework! - Blexin\" \/>\n<meta property=\"og:description\" content=\"Impariamo a usare gli ORM consapevolmente e con gli occhi aperti.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2019-04-02T22:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-13T08:40:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i2.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/ad91fe80-751b-4d34-a054-0444bfc8545a.png?fit=1024%2C608&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"608\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Michele Aponte\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Michele Aponte\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/mai-fidarsi-di-entity-framework\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/mai-fidarsi-di-entity-framework\\\/\"},\"author\":{\"name\":\"Michele Aponte\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/cdc5540c3b6edcacd8d760669e797005\"},\"headline\":\"Mai fidarsi di Entity Framework!\",\"datePublished\":\"2019-04-02T22:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/mai-fidarsi-di-entity-framework\\\/\"},\"wordCount\":1089,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/mai-fidarsi-di-entity-framework\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/ad91fe80-751b-4d34-a054-0444bfc8545a.png?fit=1024%2C608&ssl=1\",\"keywords\":[\"Asp.net core\",\"Azure\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/mai-fidarsi-di-entity-framework\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/mai-fidarsi-di-entity-framework\\\/\",\"name\":\"Mai fidarsi di Entity Framework! - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/mai-fidarsi-di-entity-framework\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/mai-fidarsi-di-entity-framework\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/ad91fe80-751b-4d34-a054-0444bfc8545a.png?fit=1024%2C608&ssl=1\",\"datePublished\":\"2019-04-02T22:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:40+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/cdc5540c3b6edcacd8d760669e797005\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/mai-fidarsi-di-entity-framework\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/mai-fidarsi-di-entity-framework\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/mai-fidarsi-di-entity-framework\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/ad91fe80-751b-4d34-a054-0444bfc8545a.png?fit=1024%2C608&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/ad91fe80-751b-4d34-a054-0444bfc8545a.png?fit=1024%2C608&ssl=1\",\"width\":1024,\"height\":608},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/mai-fidarsi-di-entity-framework\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mai fidarsi di Entity Framework!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blexin.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/cdc5540c3b6edcacd8d760669e797005\",\"name\":\"Michele Aponte\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/32138aff568f2063b34d27a23cef27e09f3159bfcadea5ea05599c499cf4342f?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/32138aff568f2063b34d27a23cef27e09f3159bfcadea5ea05599c499cf4342f?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/32138aff568f2063b34d27a23cef27e09f3159bfcadea5ea05599c499cf4342f?s=96&d=identicon&r=g\",\"caption\":\"Michele Aponte\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/michele-aponteblexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Mai fidarsi di Entity Framework! - Blexin","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/","og_locale":"it_IT","og_type":"article","og_title":"Mai fidarsi di Entity Framework! - Blexin","og_description":"Impariamo a usare gli ORM consapevolmente e con gli occhi aperti.","og_url":"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/","og_site_name":"Blexin","article_published_time":"2019-04-02T22:00:00+00:00","article_modified_time":"2021-01-13T08:40:40+00:00","og_image":[{"width":1024,"height":608,"url":"https:\/\/i2.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/ad91fe80-751b-4d34-a054-0444bfc8545a.png?fit=1024%2C608&ssl=1","type":"image\/png"}],"author":"Michele Aponte","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Michele Aponte","Tempo di lettura stimato":"6 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/"},"author":{"name":"Michele Aponte","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/cdc5540c3b6edcacd8d760669e797005"},"headline":"Mai fidarsi di Entity Framework!","datePublished":"2019-04-02T22:00:00+00:00","dateModified":"2021-01-13T08:40:40+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/"},"wordCount":1089,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/ad91fe80-751b-4d34-a054-0444bfc8545a.png?fit=1024%2C608&ssl=1","keywords":["Asp.net core","Azure"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/","url":"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/","name":"Mai fidarsi di Entity Framework! - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/ad91fe80-751b-4d34-a054-0444bfc8545a.png?fit=1024%2C608&ssl=1","datePublished":"2019-04-02T22:00:00+00:00","dateModified":"2021-01-13T08:40:40+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/cdc5540c3b6edcacd8d760669e797005"},"breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/ad91fe80-751b-4d34-a054-0444bfc8545a.png?fit=1024%2C608&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/ad91fe80-751b-4d34-a054-0444bfc8545a.png?fit=1024%2C608&ssl=1","width":1024,"height":608},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/mai-fidarsi-di-entity-framework\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"Mai fidarsi di Entity Framework!"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/cdc5540c3b6edcacd8d760669e797005","name":"Michele Aponte","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/32138aff568f2063b34d27a23cef27e09f3159bfcadea5ea05599c499cf4342f?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/32138aff568f2063b34d27a23cef27e09f3159bfcadea5ea05599c499cf4342f?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/32138aff568f2063b34d27a23cef27e09f3159bfcadea5ea05599c499cf4342f?s=96&d=identicon&r=g","caption":"Michele Aponte"},"url":"https:\/\/blexin.com\/it\/author\/michele-aponteblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-7vJ","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/ad91fe80-751b-4d34-a054-0444bfc8545a.png?fit=1024%2C608&ssl=1","_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/28875","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716248"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=28875"}],"version-history":[{"count":9,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/28875\/revisions"}],"predecessor-version":[{"id":28900,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/28875\/revisions\/28900"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/28876"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=28875"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=28875"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=28875"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}