Qual è la differenza tra "LINQ to Entities", "LINQ to SQL" e "LINQ to Dataset"


91

Lavoro da parecchio tempo con LINQ. Tuttavia, rimane un po 'un mistero quali siano le reali differenze tra i sapori menzionati di LINQ.

La risposta positiva conterrà una breve differenziazione tra di loro. Qual è l'obiettivo principale di ogni gusto, qual è il vantaggio e c'è un impatto sulle prestazioni ...

PS So che ci sono molte fonti di informazioni là fuori, ma sto cercando una specie di "foglio di trucco" che istruisca un principiante dove dirigersi per un obiettivo specifico.


Risposte:


110
  • sono tutti LINQ - Language Integrated Query, quindi condividono molti punti in comune. Tutti questi "dialetti" consentono fondamentalmente di eseguire una selezione dei dati in stile query, da varie fonti.

  • Linq-to-SQL è il primo tentativo di Microsoft di eseguire un ORM - Object-Relational Mapper. Supporta solo SQL Server. È una tecnologia di mapping per mappare le tabelle del database di SQL Server a oggetti .NET.

  • Linq-to-Entities è la stessa idea, ma utilizza Entity Framework in background, come ORM, di nuovo da Microsoft, ma supporta più backend di database

  • Linq-to-DataSets è LINQ, ma l'uso è contro i DataSet ADO.NET 2.0 "vecchio stile": prima degli ORM di Microsoft, tutto ciò che si poteva fare con ADO.NET era restituire DataSet, DataTable ecc. E Linq -to-DataSets interroga gli archivi dati per i dati. Quindi, in questo caso, restituirai un DataTable o DataSets (spazio dei nomi System.Data) da un back-end del database e quindi interrogherai quelli che utilizzano la sintassi LINQ


1
Congratulazioni per 50k, ora hai ufficialmente trascorso troppo tempo su StackOverflow. ;)
Aaronaught

1
@Aaronaught: grazie - e hai perfettamente ragione! :-) Devo lasciare una dipendenza a ogni uomo, no? Per favore?!?!?!
marc_s

1
marc_s, grazie per questa risposta. Puoi dirci qualcosa sulle prestazioni. Dalla tua risposta immagino che Linq-to-Entities sia più avanzato e quindi probabilmente più performante?
Marcel

2
@ Marcel: dal mio istinto (nessun dato concreto), direi: Linq-to-SQL o è il più veloce (solo uno strato tra database e modello a oggetti), Linq-to-Dataset un secondo vicino e Linq-to -Entities è l'ultima, perché Entity Framework ha sempre due livelli di mappatura (quindi la maggiore complessità). Ma ancora: solo una sensazione
viscerale

3
@marc_s So che questo è un vecchio post, ma LINQ to Entities sarebbe probabilmente più veloce di LINQ to Dataset nella maggior parte dei casi. LINQ to Dataset non è realmente un tipo, è LINQ over Objects di cui stai usando il set di dati come oggetto. Poiché LINQ sugli oggetti non esegue alcun SQL, devi prima creare il tuo set di dati dall'origine SQL e LINQ sugli oggetti non può aiutarti a eseguire alcuna ottimizzazione delle query sul recupero dei dati nel set di dati. Questo e i set di dati sono terribili dal punto di vista delle prestazioni poiché tutte le colonne sono in box e tutto quel tipo di spostamento uccide le prestazioni.
Robert McKee,

38

LINQ è un ampio set di tecnologie, basate (ad esempio) su una sintassi di comprensione delle query, ad esempio:

var qry = from x in source.Foo
          where x.SomeProp == "abc"
          select x.Bar;

che è mappato dal compilatore in codice:

var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);

e qui inizia la vera magia. Nota che non abbiamo detto cosa Fooc'è qui - e al compilatore non importa! Finché può risolvere un metodo adatto chiamato Whereche può richiedere un lambda, e il risultato di ciò ha un Select metodo che può accettare il lambda, è felice.

Si consideri ora che il lambda può essere compilato sia in un metodo anonimo (delegato, per LINQ-to-oggetti, che comprende LINQ to DataSet), o un'espressione-albero (un modello di esecuzione che rappresenta il lambda in un modello di oggetti ).

Per i dati in memoria (in genere IEnumerable<T>), esegue solo il delegato, in modo corretto e veloce. Ma per IQueryable<T>la rappresentazione dell'oggetto dell'espressione (a LambdaExpression<...>) può separarla e applicarla a qualsiasi esempio "LINQ-to-Something".

Per i database (LINQ-to-SQL, LINQ-to-Entities) ciò potrebbe significare scrivere TSQL, ad esempio:

SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1

Ma potrebbe (per ADO.NET Data Services, ad esempio) significare scrivere una query HTTP.

L'esecuzione di una query TSQL ben scritta che restituisce una piccola quantità di dati è più veloce che caricare un intero database sulla rete e quindi filtrare sul client. Entrambi hanno scenari ideali e scenari chiaramente sbagliati, però.

L'obiettivo e il vantaggio qui è di consentire di utilizzare un'unica sintassi controllata statica per eseguire query su un'ampia gamma di origini dati e di rendere il codice più espressivo (il codice "tradizionale" per raggruppare i dati, ad esempio, non lo è molto chiaro in termini di ciò che sta cercando di fare - si perde nella massa di codice).


Marc, grazie per questa intuizione. Tuttavia, non ho chiesto informazioni su interni così dettagliati. -1, mi dispiace, perché non risponde alla domanda.
Marcel

7
Essendo qualcuno che scrive il proprio provider LINQ, questa è la migliore risposta che ho visto finora. Non sono d'accordo sul -1.
Dan Barowy

30

LINQ sta per query integrata nel linguaggio. Consente di utilizzare il linguaggio di query in "stile SQL" direttamente in C # per estrarre informazioni dalle origini dati.

  • Quell'origine dati potrebbe essere un database del server SQL: questo è Linq to SQL
  • Tale origine dati potrebbe essere un contesto dati di oggetti framework di entità - Linq per entità .
  • Tale origine dati potrebbe essere data set ADO.net - da Linq a Dataset .

Quella sorgente dati potrebbe anche essere un file XML, da Linq a XML .
O anche solo una classe Collection di oggetti semplici: Linq to Objects .

LINQ descrive la tecnologia di query, il resto del nome descrive l'origine dei dati interrogati.

Per un po 'di background in più:

I set di dati sono oggetti ADO.net in cui i dati vengono caricati da un database in un set di dati .net e Linq può essere utilizzato per eseguire query su tali dati dopo il caricamento.

Con Linq to SQL si definiscono le classi .net che mappano al database e Linq-to-SQL si occupa di caricare i dati dal database del server SQL

Infine, il framework Entity è un sistema in cui è possibile definire un database e una mappatura di oggetti in XML e quindi utilizzare Linq per interrogare i dati caricati tramite questa mappatura.


3
in realtà, Linq-to-SQL è solo SQL Server , non solo "qualsiasi" database SQL.
marc_s

3
@marc_s: buon posto. Grazie. Sebbene, se qualcuno è interessato, ci sono fornitori di terze parti da Linq a sql per altri database, se li desideri. Vedi code2code.net/DB_Linq o Google per altri. Non posso commentare la loro qualità però.
Simon P Stevens

1
Simon, grazie soprattutto per l'utile riassunto di due righe del framework Entitiy. +1
Marcel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.