88 votes

Quelle est la différence entre "LINQ to Entities", "LINQ to SQL" et "LINQ to Dataset" ?

Je travaille depuis un certain temps maintenant avec LINQ. Cependant, les différences réelles entre les différentes versions de LINQ restent un peu mystérieuses.

La réponse retenue contiendra une brève différenciation entre les deux. Quel est l'objectif principal de chaque saveur, quel est le bénéfice, et y a-t-il un impact sur la performance...

P.S. Je sais qu'il existe de nombreuses sources d'information, mais je cherche une sorte d'"aide-mémoire" qui indiquerait à un débutant où se diriger pour atteindre un objectif spécifique.

107voto

marc_s Points 321990
  • Tous ces dialectes sont des LINQ - Language Integrated Query - et partagent donc de nombreux points communs. Tous ces "dialectes" vous permettent essentiellement d'effectuer une sélection de données de type requête, à partir de diverses sources.

  • Linq-to-SQL est la première tentative de Microsoft pour un ORM (Object-Relational Mapper). Il ne prend en charge que SQL Server. Il s'agit d'une technologie de mappage permettant de faire correspondre les tables de la base de données SQL Server aux objets .NET.

  • Linq-to-Entities est la même idée, mais en utilisant Entity Framework en arrière-plan, comme ORM - toujours de Microsoft, mais supportant plusieurs bases de données.

  • Linq-to-DataSets est LINQ, mais il est utilisé contre les DataSets ADO.NET 2.0 "à l'ancienne" - avant l'apparition des 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. Ainsi, dans ce cas, vous renvoyez une table de données ou des ensembles de données (espace de noms System.Data) à partir d'une base de données, puis vous les interrogez en utilisant la syntaxe LINQ.

37voto

Marc Gravell Points 482669

LINQ est un vaste ensemble de technologies, basées notamment sur une syntaxe de compréhension des requêtes, 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 le réel La magie opère. Notez que nous n'avons pas dit ce que Foo est ici - et le compilateur ne s'en soucie pas ! Tant qu'il peut résoudre un peu de méthode appropriée appelée Where qui peut prendre un lambda, et le résultat de cela a un peu de Select qui peut accepter le lambda, il est heureux.

Considérons 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), ou à un arbre d'expression (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é - c'est parfait et rapide. Mais pour IQueryable<T> la représentation-objet de l'expression (a LambdaExpression<...> ), il peut le démonter et l'appliquer à n'importe quel exemple de "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 les services de données ADO.NET, 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 sur le client. Dans les deux cas, il existe des scénarios idéaux et des scénarios tout à fait erronés.

L'objectif et l'avantage ici sont de vous permettre d'utiliser une syntaxe unique, vérifiée statiquement, 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).

29voto

Simon P Stevens Points 17536

LINQ est l'abréviation de "language integrated query". Il vous permet d'utiliser un langage d'interrogation de "style SQL" directement dans C# pour extraire des informations de sources de données.

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

Cette source de données pourrait aussi être un fichier XML - Linq à XML .
Ou même simplement une classe de collection d'objets ordinaires - 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 de contexte supplémentaire :

Ensembles de données sont des objets ADO.net où les données sont chargées d'une base de données dans un Dataset .net et où 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 de charger les données à partir de la base de données du serveur SQL.

Et enfin le Cadre d'entités est un système qui permet de définir une base de données et un mappage d'objets en XML, puis d'utiliser Linq pour interroger les données chargées via ce mappage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X