Dynamic collections dynamiques Linq sur Dapper - possible?

c# dapper linq

Question

Nous étudions l'utilisation de LinQ pour interroger une collection dynamique interne créée par Dapper. La question est:

Comment exécuter LinQ dynamique sur la collection en utilisant le linq dynamique de Scott Guthrie (ou une autre technologie si possible)? ( http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library )

C'est ce que nous voulons faire (beaucoup simplifié):

Utilisez Dapper pour renvoyer une collection dynamique (ici appelée lignes):

rows = conn.Query(“select ACCOUNT, UNIT, AMOUNT from myTable”);

Si nous utilisons une requête LinQ «statique», il n'y a pas de problème. Donc ça marche bien:

var result = rows.Where(w => w.AMOUNT > 0);

Mais nous aimerions écrire quelque chose de similaire en utilisant Linq dynamique:

var result = rows.Where("AMOUNT > 0");

Mais nous ne pouvons pas faire fonctionner cela.

L'erreur que nous obtenons est la suivante:

Aucune propriété ou champ «AMOUNT» n'existe dans le type «Objet»

(Nous avons aussi essayé beaucoup d'autres syntaxes - mais nous ne pouvons pas les faire fonctionner)

Remarque: nous ne souhaitons pas utiliser SQL dynamique lorsque Dapper demande des données à partir de la base de données (ce qui est facile). Nous souhaitons exécuter de nombreuses instructions Linq dynamiques sur la collection renvoyée par la requête Dapper.

Est-ce que le dynamique de ScottGu Linq ne fonctionne qu'avec «LinQ to SQL»?

Existe-t-il une autre approche alternative pour réaliser la même chose? (La performance est une question clé)

/ Erik

Réponse d'expert

conn.Query("...")

renvoie un IEnumerable<dynamic> . Cependant, pré-date « LINQ dynamique » dynamic , et probablement personne n'a mis à jour pour fonctionner avec dynamic ; cela pourrait certainement être fait, mais c'est du travail (et pas trivial). Options:

  • utiliser la Query<T> pour certains T
  • apporter les modifications nécessaires à "LINQ dynamique" et, de préférence, mettre ces modifications à la disposition de la communauté au sens large

Réponse populaire

Je soupçonne que conn.Query(“select ACCOUNT, UNIT, AMOUNT from myTable†); renvoie IEnumerable<object> . Pour que DLinq fonctionne, vous devez avoir IEnumerable<TheActualType> .

Vous pouvez essayer ceci:

conn.Query<dynamic>("yourQueryString")
   .ToList()
 //.ToAnonymousList()
   .Where("AMOUNT > 0"); 

Si cela ne fonctionne pas, vous pouvez essayer d'utiliser ToAnonymousList , qui essaie de renvoyer IList<TheActualType .



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