Meilleure façon d'écrire une requête dynamique avec un résultat dynamique avec Linq ou Expression Tree

c# expression-trees linq linq-to-sql

Question

Je cherche le meilleur moyen d'écrire une requête avec LINQ ou un arbre d'expression pour renvoyer un résultat dynamique en fonction d'une entrée dynamique. Par exemple, considérons ce pseudocode:

CREATE PROCEDURE Test
@Input      NVARCHAR(50)
AS
BEGIN
DECLARE @Query      NVARCHAR(100);
SET @Query=N'SELECT ' + @Input + ' FROM MyTable'

EXEC @Query
END

Quel est le meilleur moyen de:

  1. Codez ceci en utilisant LINQ ou un arbre d'expression
  2. Appelez-le en tant que procédure stockée à l'aide de LINQ to SQL

EDIT 1)

Considérez que chaque requête dynamique n'inclut pas l'instruction SELECT . Par exemple, j'ai récemment écrit une requête dynamique PIVOT . Je ne peux donc pas utiliser Dynamic LINQ.

Réponse acceptée

Linq dynamique? Probablement pas

J'allais suggérer Dynamic Linq mais, comme l'indique votre "Edition", cela ne vous convient pas.

Dans ce cas, je dirais que la réponse à votre question est "Il n'y a pas de meilleur moyen".

Linq est-il le meilleur choix pour cela?

Votre question demande une implémentation de Linq, en particulier Linq to Sql, sur la manière de réaliser vos requêtes dynamiques.

Mais considérons à quoi sert Linq to Sql. Les principaux avantages qui viennent à l’esprit de Linq to SQL sont les suivants:

  1. Requêtes fortement typées (erreurs de capture lors de la compilation)
  2. Résultats fortement typés. Ce qui signifie de belles classes pré-écrites (dans Linq à SQL, pré-généré)

Maintenant, si vous faites des instructions "Select" et que vous retournez toujours une table mappée réelle, rien ne vous empêche d'utiliser la bibliothèque dynamique Linq.

Mais si vous renvoyez des résultats arbitraires non mappés, utiliser LINQ ne sert à rien, il ne vous le permettra pas.

DataContext.ExecuteQuery<T>(string query)

La classe DataContext a une ExecuteQuery<T> , mais vous ne pouvez malheureusement pas retourner de spécification dynamic en tant que T :-(

Linq to SQL et les procédures stockées

Enfin, LINQ to SQL peut mapper des procédures stockées. Ainsi, vous pourriez avoir une procédure stockée qui prend une requête en argument, comme dans votre exemple. Cependant, je pense que ExecuteQuery les mêmes limites en termes de types de résultats, bien que cela ne m'oblige pas.

J'examinerais cela comme votre dernière option et explorerais le sproc du concepteur Linq to SQL renvoyant un type anonyme, dynamique ou mappé.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow