Dynamique requête Linq - comment puis-je construire la clause select?

Je suis en train de faire quelques tests avec Dynamique de Linq pour le moment, mais étant nouveau, je vais avoir des ennuis.

Actuellement, j'ai un objet DataTable que j'ai complété par une requête SQL à une base de données. Maintenant, je veux exécuter dynamique des requêtes linq sur ce DataTable. Cela peut sembler illogique, mais mon objectif final est de pouvoir effectuer des jointures sur deux tables de données qui sont remplies par les deux bases de données différentes, donc, avec cela à l'esprit, j'espère qu'il fait plus de sens.
J'essaie de comprendre une situation plus simple et expérimenter un peu avec elle avant d'aller de l'avant pour résoudre ce problème.

Question est que je ne suis pas entièrement sûr de savoir le choix entre IQueryable(T) et IEnumerable(Of T). La façon dont je le comprends, c'est que si vous faites tout dans le mémoire que vous choisissez IEnumerable. Je pense que, s'adapte pour mon cas, non? Cependant, quand j'ai regardé la modification de la IEnumerable dans IQuerbyable (dans l'extrait de code ci-dessous), j'ai été surpris de voir que la "x.Élément(Fieldname)" ne fonctionne pas!? Ce qui me manque? L'erreur qu'il a donné est: "la Fin des opérations de Liaison ne peut pas être converti à une Arborescence d'Expression".

De toute façon, permet de jeter un coup d'oeil. J'ai déjà une partie de ce travail:

    Dim desc As String = "Description"
    Dim status As String = "Status"

    Dim query As IEnumerable(Of DataRow) = From x In tab.AsEnumerable()
    query = query.Where(Function(x As Object) x.Item(status) < 100)

    For Each row As DataRow In query.ToList()
    'Do something
    Next row

Cela semble bien fonctionner. J'ai utilisé les deux variables de chaîne, parce que dans la fin, je veux dynamiquement décider du domaine à prendre. Alors, "x!Description" n'est pas la voie à suivre pour moi. Cependant, maintenant, je voulais ajouter une projection de la requête, c'est à dire de Sélectionner un certain nombre de colonnes.Mon espoir était que cela doit fonctionner comme ceci:

query = query.Select(Of String)(Function(x As Object) x.Item(desc))

(N. B.: j'utilise Select(De la Chaîne), parce que cette colonne a que comme un type. Cela devrait bien sûr, en fin de compte être dynamiquement rempli trop)

Toutefois, il échoue en cours d'exécution sur un InvalidCastException: "Impossible de convertir l'objet de type 'WhereSelectEnumerableIterator2[System.Data.DataRow,System.String]' to type 'System.Collections.Generic.IEnumerable1[Système.Les données.DataRow]'." Je n'ai pas vraiment comprendre ce qui se passe ici; je devine que quelque chose est faux, parce que je veux retourner DataRow, mais pour le moment uniquement sélectionner un champ, qui se trouve être une Chaîne de caractères. Quelqu'un peut-il expliquer et m'aider?

Merci d'avance!

OK, MODIFIER, comme je devrais probablement avoir donné quelques infos à partir de zéro:
Je pourrais avoir un nombre variable d'où - ou sélectionnez-les clauses. Mon idée était que je pouvais ajouter dynamiquement en parcourant la liste qui contient cette information. Alors j'ai pensé que j'ai un peu besoin de la .Où() et .Sélectionnez() les fonctions qui IEnumerable offre.

OriginalL'auteur Martao | 2012-08-21