Avantages de LINQ par rapport aux chaînes de méthodes fonctionnelles

c# expression-trees kotlin linq sql

Question

Kotlin Slack a discuté de la possibilité d'ajouter des arbres de code pour prendre en charge des éléments tels que C # LINQ.

En C #, LINQ a de nombreuses applications, mais je souhaite me concentrer sur une seule (car d’autres sont déjà couvertes par la syntaxe Kotlin): composer des requêtes SQL vers des bases de données distantes.

Conditions préalables:

  • Nous avons un schéma de données d'une base de données SQL exprimé en quelque sorte dans le code afin que les outils statiques (ou le système de types) puissent vérifier l'exactitude (au moins le nommage) d'une requête SQL

  • Nous devons générer les requêtes sous forme de chaînes

  • Nous voulons une syntaxe proche des flux SQL ou Java

Question : qu'est-ce que les arbres d'expression ajoutent à la syntaxe qui est si cruciale pour la tâche à accomplir? À quel point un constructeur SQL peut-il être sans eux?

Réponse populaire

Quelle est la qualité d'une requête dsl sans arborescence d'expression?

Comme JINQ l' a montré, vous pouvez aller très loin en analysant le bytecode pour comprendre l'intention du développeur et ainsi traduire le prédicat en SQL. Donc, en principe, les arbres d’expression ne sont pas indispensables pour créer une belle requête dsl:

val alices = database.customerStream().where { it.name == "Alice" }

Même sans hackery tel que l'analyse de bytecode, il est possible d'obtenir une requête dsl décente avec la génération de code. Querydsl et JOOQ sont d'excellents exemples. Avec un peu de code d’emballage Kotlin, vous pouvez alors écrire

val alices = db.findAll(QCustomer.customer, { it.name.eq("Alice") }) 

Comment les arbres d'expression aident-ils à construire la requête dsl

L'arbre d'expression est une structure représentant un code qui se résout en une valeur. Avec une telle structure générée par le compilateur, une analyse de bytecode n'est pas nécessaire pour comprendre ce que l'on est censé faire. Étant donné l'exemple

val alices = database.customerStream().where { it.name == "Alice" }

L'argument de where fonction serait une expression que nous pouvons inspecter au moment de l'exécution et la traduire en SQL ou en un autre langage de requête. Parce que les arbres d'expression représentent du code, vous n'avez pas besoin de basculer entre les paradigmes Kotlin et SQL pour écrire des requêtes. Le code de requête exprimé avec linq / jinq est à peu près le même, qu’ils soient exécutés en mémoire avec POCO / POJO ou que le moteur de base de données utilise son langage de requête. Le compilateur peut également effectuer plus de vérification de type. De plus, il est très facile de remplacer la base de données sous-jacente par une représentation en mémoire pour accélérer l'exécution des tests.

Lectures complémentaires:



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi