Quelle est la différence entre «LINQ to Entities», «LINQ to SQL» et «LINQ to Dataset»


91

Je travaille depuis un certain temps maintenant avec LINQ. Cependant, les véritables différences entre les saveurs mentionnées de LINQ restent un peu mystérieuses.

La réponse réussie contiendra une brève différenciation entre eux. Quel est l'objectif principal de chaque saveur, quel est l'avantage et y a-t-il un impact sur les performances ...

PS Je sais qu'il existe de nombreuses sources d'informations, mais je recherche une sorte de "feuille de triche" qui indique à un débutant où se diriger vers un objectif spécifique.


Réponses:


110
  • tous sont LINQ - Language Integrated Query - ils partagent donc tous beaucoup de points communs. Tous ces "dialectes" vous permettent essentiellement de faire une sélection de données de type requête, à partir de diverses sources.

  • Linq-to-SQL est la première tentative de Microsoft sur un ORM - Object-Relational Mapper. Il prend uniquement en charge SQL Server. Il s'agit d'une technologie de mappage pour mapper les tables de base de données SQL Server sur des objets .NET.

  • Linq-to-Entities est la même idée, mais en utilisant Entity Framework en arrière-plan, comme ORM - encore une fois de Microsoft, mais prenant en charge plusieurs backends de base de données

  • Linq-to-DataSets est LINQ, mais l'utilisation est contre les DataSets ADO.NET 2.0 «à l'ancienne» - à l'époque précédant les ORM de Microsoft, tout ce que vous pouviez faire avec ADO.NET était de renvoyer des DataSets, des DataTables, etc., et Linq -to-DataSets interroge ces magasins de données pour les données. Donc, dans ce cas, vous retournez un DataTable ou DataSets (espace de noms System.Data) à partir d'un backend de base de données, puis interrogez ceux à l'aide de la syntaxe LINQ


1
Félicitations pour 50k, vous avez maintenant officiellement passé trop de temps sur StackOverflow. ;)
Aaronaught

1
@Aaronaught: merci - et vous avez absolument raison! :-) Je dois laisser une addiction à chaque homme, non? S'il vous plaît?!?!?!
marc_s

1
marc_s, merci pour cette réponse. Pouvez-vous dire quelque chose sur les performances. D'après votre réponse, je suppose que Linq-to-Entities est le plus avancé et donc probablement le plus performant?
Marcel

2
@Marcel: de mon instinct (pas de faits concrets), je dirais: Linq-to-SQL ou est le plus rapide (une seule couche entre la base de données et le modèle objet), Linq-to-Dataset une seconde de près, et Linq-to -Entities est le dernier, car Entity Framework a toujours deux couches de mappage (donc la plus complexe). Mais encore une fois: juste un sentiment instinctif, pas de chiffres pour le
confirmer

3
@marc_s Je sais que c'est un ancien message, mais LINQ to Entities serait probablement plus rapide que LINQ to Dataset dans la plupart des cas. LINQ to Dataset n'est pas vraiment un type, c'est LINQ sur les objets dont vous utilisez l'ensemble de données comme objet. Étant donné que LINQ over objects ne fait aucun SQL, vous devez d'abord créer votre ensemble de données à partir de la source SQL, et LINQ over objets ne peut pas vous aider à effectuer des optimisations de requête lors de la récupération des données dans l'ensemble de données. Cela et les ensembles de données sont terribles en termes de performances car toutes les colonnes sont encadrées et tout ce changement de type tue les performances.
Robert McKee

38

LINQ est un large ensemble de technologies, basé sur (par exemple) une syntaxe de compréhension de requête, par exemple:

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

qui est mappé par le compilateur en code:

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

et ici la vraie magie commence. Notez que nous n'avons pas dit ce qu'il Fooy a ici - et le compilateur s'en fiche! Tant qu'il peut résoudre une méthode appropriée appelée Wherequi peut prendre un lambda, et que le résultat de cela a une Select méthode qui peut accepter le lambda, il est heureux.

Considérez maintenant que le lambda peut être compilé soit dans une méthode anonyme (délégué, pour LINQ-to-Objects, qui inclut LINQ-to-DataSet), soit dans un expression-tree (un modèle d'exécution qui représente le lambda dans un modèle objet ).

Pour les données en mémoire (généralement IEnumerable<T>), il exécute simplement le délégué - très bien et rapidement. Mais pour IQueryable<T>la représentation objet de l'expression (a LambdaExpression<...>), elle peut la séparer et l'appliquer à n'importe quel exemple "LINQ-to-Something".

Pour les bases de données (LINQ-to-SQL, LINQ-to-Entities), cela peut signifier écrire TSQL, par exemple:

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

Mais cela pourrait (pour ADO.NET Data Services, par exemple) signifier écrire une requête HTTP.

L'exécution d'une requête TSQL bien écrite qui renvoie une petite quantité de données est plus rapide que le chargement d'une base de données entière sur le réseau, puis le filtrage au niveau du client. Les deux ont des scénarios idéaux et des scénarios tout à fait faux, cependant.

L'objectif et l'avantage ici est de vous permettre d'utiliser une seule syntaxe vérifiée de manière statique pour interroger un large éventail de sources de données, et de rendre le code plus expressif (le code "traditionnel" pour regrouper des données, par exemple, n'est pas très clair en termes de ce qu'il essaie de faire - il est perdu dans la masse du code).


Marc, merci pour cette perspicacité. Cependant, je n'ai pas posé de questions sur ces internes détaillés. -1, je suis désolé, car cela ne répond pas à la question.
Marcel

7
En tant que personne qui écrit son propre fournisseur LINQ, c'est la meilleure réponse que j'ai vue jusqu'à présent. Je ne suis pas d'accord sur le -1.
Dan Barowy

30

LINQ signifie requête intégrée au langage. Il vous permet d'utiliser le langage de requête de «style SQL» directement dans C # pour extraire des informations à partir de sources de données.

  • Cette source de données pourrait être une base de données de serveur SQL - c'est Linq to SQL
  • Cette source de données pourrait être un contexte de données d'objets de structure d'entité - Linq aux entités .
  • Cette source de données peut être des ensembles de données ADO.net - Linq vers Dataset .

Cette source de données peut également être un fichier XML - Linq to XML .
Ou même juste une classe Collection d'objets simples - Linq to Objects .

LINQ décrit la technologie d'interrogation, le reste du nom décrit la source des données interrogées.

Pour un peu plus de fond:

Les ensembles de données sont des objets ADO.net dans lesquels les données sont chargées à partir d'une base de données dans un ensemble de données .net et Linq peut être utilisé pour interroger ces données après leur chargement.

Avec Linq to SQL, vous définissez des classes .net qui correspondent à la base de données et Linq-to-SQL se charge du chargement des données depuis la base de données du serveur SQL

Enfin, le framework Entity est un système dans lequel vous pouvez définir une base de données et un mappage d'objets en XML, puis utiliser Linq pour interroger les données chargées via ce mappage.


3
en fait, Linq-to-SQL est uniquement SQL Server - pas seulement «n'importe quel» serveur de base de données SQL.
marc_s

3
@marc_s: Bon spot. Merci. Bien que, si quelqu'un est intéressé, il existe des fournisseurs tiers Linq vers SQL pour d'autres bases de données si vous le souhaitez. Voir code2code.net/DB_Linq ou Google pour les autres. Je ne peux cependant pas commenter leur qualité.
Simon P Stevens

1
Simon, merci en particulier pour ce résumé utile en 2 lignes du framework Entitiy. +1
Marcel
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.