web-dev-qa-db-fra.com

Migration du code Linq vers SQL vers .Net Core

Nous avons un code hérité qui utilise Linq to SQL comme ORM. Nous aimerions migrer cette logique vers .Net Core afin de pouvoir l’héberger sur un serveur Linux. Autant que je sache, L2S n'est pas inclus dans .Net Core.

Quelle est la voie de migration de moindre résistance?

9
Homr Zodyssey

Si vous avez utilisé L2S parce que EF est inefficace avec les opérations Ignorer et Prendre pour obtenir des résultats volumineux sous forme de morceaux, votre meilleur choix est/ Dapper . Procurez-vous une copie de LINQPad et utilisez-la pour obtenir le code SQL généré pour chacune de vos expressions LINQ. 

L2S enveloppe une requête SQL bizarre autour de la requête afin d'utiliser la fonction de numéro d'ordre de SQL pour implémenter les opérations de saut et de reprise. Si vous utilisez la dernière version de SQL Server, vous n'en avez plus besoin, car TSQL a maintenant des clauses équivalentes à ignorer et prendre. C'est pratique si vous écrivez directement du SQL et que vous produisez un SQL compréhensible qui n'induira pas le WTF chez ceux qui suivent, mais le mode LINQ fonctionne sur toutes les versions de SQL Server.

Ensuite, utilisez ce SQL avec Dapper, qui fera la partie ORM pour vous. Il prend également en charge les paramètres de mappage de types similaires à L2S, ce qui vous permet d'éviter de créer des chaînes SQL et des vulnérabilités d'injection.

Si vous voulez avoir toutes les connaissances nécessaires pour construire des graphiques d'objet avec des valeurs FK impliquées par l'appartenance à une collection, alors vous n'avez pas de chance, vous devrez le coder à la main.

mise à jour 2018-05-11

EF est moins horrible qu'avant. EF Core est plus simple que EF tout en conservant de nombreux avantages. J'utilise actuellement EF Core sur un projet en cours et ce n'est pas le désastre que EF a déjà été. 

J'ai eu à aider avec une jointure externe. Laissé à ses propres périphériques, LINQ a récupéré la partie interne puis, pour chaque ligne interne, une requête distincte a été lancée pour sa partie externe. 

J'ai corrigé cela en explicitement en récupérant la partie interne et en construisant un jeu de clés comme un tableau d'int. Une autre instruction LINQ extraite all des lignes extérieures en exploitant le fait que Array.Contains est mappé sur IN, qui utilise des index. Ensuite, j'ai matérialisé les deux parties en utilisant ToArray() et utilisé LINQ pour les joindre en mémoire. Cela a ramené le temps d'exécution de dix minutes à 300 ms. 

Vous ne devriez pas avoir à faire cela; L2S ne l'aurait pas préparé en premier lieu. Mais au moins, il existe une solution générale simple. 

Un inconvénient de ma solution est qu’elle n’est pas bien adaptée à l’extraction progressive.

5
Peter Wone

Si vous réécrivez le code hérité dans .NET Core, cela nécessitera quelques efforts. 

Et pour L2S, vous devrez probablement réécrire cela dans les requêtes modernes à l’aide de Entity Framework Core. Cela pourrait vous faciliter la tâche de générer des entités à partir de la base de données, voir Reverse engineering de votre modèle .

Ce serait la méthode recommandée, mais je ne suis pas sûr que ce soit la plus facile dans votre cas.

1
Ignas

LinqConnect de DevArt prend désormais en charge .NET Core à compter de mai 2017:

https://www.devart.com/news/2017/net-core-support.html

C'est un remplacement instantané de Linq To Sql et il vous déloge même de MS SQL Server si vous le souhaitez!

0
RoboJ1M