web-dev-qa-db-fra.com

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

Je travaille depuis longtemps avec LINQ. Cependant, il reste un peu mystérieux quelles sont les vraies différences entre les saveurs mentionnées de LINQ.

La réponse réussie contiendra une courte 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 ...

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

86
Marcel
  • tous sont LINQ - Language Integrated Query - donc ils partagent 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 pour un ORM - Object-Relational Mapper. Il prend en charge SQL Server uniquement. Il s'agit d'une technologie de mappage pour mapper les tables de 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 l'ORM - encore une fois de Microsoft, mais en 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 avant les ORM de Microsoft, tout ce que vous pouviez faire avec ADO.NET était de renvoyer des DataSets , DataTables etc. et Linq-to-DataSets interroge ces magasins de données pour les données. Donc, dans ce cas, vous renvoyez un DataTable ou DataSets (espace de noms System.Data) à partir d'un backend de base de données, puis interrogez ceux qui utilisent la syntaxe LINQ

106
marc_s

LINQ est un large éventail 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 commence la magie réelle . Notez que nous n'avons pas dit ce que Foo est ici - et le compilateur s'en fiche! Tant qu'il peut résoudre certains méthode appropriée appelée Where qui peut prendre un lambda, et le résultat de cela a certainsSelect méthode qui peut accepter le lambda, il est content.

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), o à 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é - fin et rapide. Mais pour IQueryable<T> la représentation objet de l'expression (un LambdaExpression<...>) il peut le 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 sur le client. Cependant, les deux ont des scénarios idéaux et des scénarios tout à fait faux.

Le but et l'avantage ici sont de vous permettre d'utiliser une seule syntaxe à vérification 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 de code).

36
Marc Gravell

LINQ signifie requête de langue intégrée. Il vous permet d'utiliser le langage de requête "de style SQL" directement dans C # pour extraire des informations des 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 pourrait être des ensembles de données ADO.net - Linq to Dataset.

Cette source de données pourrait également être un fichier XML - Linq to XML.
Ou même simplement 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 de fond supplémentaire:

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

Avec Linq to SQL vous définissez les classes .net qui sont mappées à la base de données et Linq-to-SQL se charge de charger les données depuis la base de données du serveur SQL

Et enfin, Entity Framework est un système où vous pouvez définir une base de données et un mappage d'objet en XML, puis vous pouvez utiliser Linq pour interroger les données qui sont chargées via ce mappage.

26
Simon P Stevens