Domanda

Quando si utilizza Entity Framework, ESQL funziona meglio di Linq to Entities?

Preferirei utilizzare Linq to Entities (principalmente a causa del controllo di tipo forte), ma alcuni altri membri del mio team citano le prestazioni come motivo per utilizzare ESQL.Vorrei avere un'idea completa dei pro/contro dell'utilizzo di entrambi i metodi.

È stato utile?

Soluzione

Le differenze più evidenti sono:

Linq to Entities è un codice fortemente tipizzato che include una bella sintassi di comprensione delle query.Il fatto che il "da" venga prima del "seleziona" consente a IntelliSense di aiutarti.

Entity SQL utilizza query tradizionali basate su stringhe con una sintassi SQL più familiare in cui l'istruzione SELECT viene prima di FROM.Poiché eSQL è basato su stringhe, le query dinamiche possono essere composte in modo tradizionale in fase di esecuzione utilizzando la manipolazione delle stringhe.

La differenza fondamentale meno ovvia è:

Linq to Entities ti consente di modificare la forma o "proiettare" i risultati della tua query in qualsiasi forma desideri con il comando "seleziona nuovo{...}” sintassi.I tipi anonimi, una novità di C# 3.0, lo hanno consentito.

La proiezione non è possibile utilizzando Entity SQL poiché è necessario restituire sempre un ObjectQuery<T>.In alcuni scenari è possibile utilizzare ObjectQuery<object> tuttavia è necessario aggirare il fatto che .Select restituisce sempre ObjectQuery<DbDataRecord>.Vedi il codice qui sotto...

ObjectQuery<DbDataRecord> query = DynamicQuery(context,
        "Products",
        "it.ProductName = 'Chai'",
        "it.ProductName, it.QuantityPerUnit");

public static ObjectQuery<DbDataRecord> DynamicQuery(MyContext context, string root, string selection, string projection)
{
    ObjectQuery<object> rootQuery = context.CreateQuery<object>(root);
    ObjectQuery<object> filteredQuery = rootQuery.Where(selection);
    ObjectQuery<DbDataRecord> result = filteredQuery.Select(projection);
    return result;
}

Ci sono altre differenze più sottili descritte in dettaglio da uno dei membri del team Qui E Qui.

Altri suggerimenti

ESQL può anche generare alcuni file SQL particolarmente dannosi.Ho dovuto tenere traccia di un problema con una query del genere che utilizzava classi ereditate e ho scoperto che il mio insignificante ESQL di 4 righe è stato tradotto in un'istruzione SQL mostruosa di 100.000 caratteri.

Ha fatto la stessa cosa con Linq e il codice compilato era molto più gestibile, diciamo 20 righe di SQL.

Inoltre, ciò che altre persone hanno menzionato, Linq è fortemente tipografico, anche se molto fastidioso eseguire il debug senza la funzionalità di modifica e continuazione.

ANNO DOMINI

Entity-SQL (eSQL) ti consente di eseguire operazioni come query dinamiche più facilmente rispetto a LINQ to Entities.Tuttavia, se non disponi di uno scenario che richiede eSQL, esiterei a fare affidamento su di esso su LINQ perché sarà molto più difficile da mantenere (ad es.niente più controlli in fase di compilazione, ecc.).

Credo che LINQ ti consenta anche di precompilare le tue query, il che potrebbe darti prestazioni migliori.Rico Mariani blog sulle prestazioni LINQ qualche tempo fa e discute le query compilate.

bel grafico che mostra i confronti delle prestazioni qui: Prestazioni di Entity Framework esplorateNon si osserva molta differenza tra ESQL ed entità, ma differenze complessive significative nell'uso delle entità su query dirette

Entity Framework utilizza due livelli di mapping degli oggetti (rispetto a un singolo livello in LINQ to SQL) e il mapping aggiuntivo comporta costi in termini di prestazioni.Almeno nella versione 1 di EF, i progettisti di applicazioni dovrebbero scegliere Entity Framework solo se le funzionalità di modellazione e mapping ORM possono giustificare tale costo.

La maggiore quantità di codice che puoi coprire con il controllo del tempo di compilazione per me è qualcosa su cui darei un premio più elevato rispetto alle prestazioni.Detto questo, in questa fase probabilmente propenderei per ESQL non solo per le prestazioni, ma è anche (al momento) molto più flessibile in ciò che può fare.Non c'è niente di peggio che utilizzare uno stack tecnologico che non ha una funzionalità di cui hai veramente bisogno.

Il framework delle entità non supporta cose come proprietà personalizzate, query personalizzate (per quando è necessario ottimizzare realmente le prestazioni) e non funziona come linq-to-sql (ad es.ci sono funzionalità che semplicemente non funzionano nell'entità framework).

La mia impressione personale di Entity Framework è che ci sia molto potenziale, ma probabilmente è un po' troppo "rigido" nella sua implementazione da utilizzare in un ambiente di produzione nel suo stato attuale.

Per le query dirette utilizzo linq to Entities, per le query dinamiche utilizzo ESQL.Forse la risposta non è né/o, ma e/anche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top