2010-12-16 5 views
6

PROBLÈME RÉSOLU !!!Commander LINQ par "string" name

La solution est Linq.Dynamic

Vous le faites comme ceci:

(from c in Context.AccountCharts 
    where c.Account_FK == account && c.Year_FK == year select c).OrderBy(order); 

Vous devez télécharger le System.Linq.Dynamic.dll et l'inclure dans votre projet.


Existe-t-il un moyen de commander une requête linq par le nom d'un champ. comme ceci:

from c in Context.AccountCharts 
    where c.Account_FK == account && c.Year_FK == year 
    orderby c["ColName"] select c; 

Ou

from c in Context.AccountCharts 
    where c.Account_FK == account && c.Year_FK == year 
    orderby c.GetType().GetField("ColName") select c; 

Aucune de ces deux œuvres, mais je l'espère vous une façon de le faire.

+0

Vous voulez trier l'ensemble table, basé sur un champ qui peut changer rangée par rangée? c'est-à-dire, si ColName est "Account_FK" dans la première ligne, et "Year" est la deuxième ligne, par quelle colonne voulez-vous le trier? –

+0

Vous essayez donc d'utiliser la réflexion dans une requête LINQ? Que se passe-t-il si vous optez pour 'orderby c.GetType(). GetField (" ColName "). GetValue (c)'? –

+0

@ James, @Anon, je pense qu'il veut simplement que le 'orderby' soit variable plutôt que codé en dur. Donc, dans un cas, il veut trier sur ColumnA, un autre ColumnB, et préfèrerait ne pas écrire plusieurs fonctions qui ne diffèrent que sur la ligne 'orderby'. Si c'est le cas, son utilisation du terme 'field' est regrettable, car cela implique une variable de membre privé plutôt qu'une colonne dans une base de données. –

Répondre

1

je passe à beaucoup de temps pour résoudre ce problème, mais n'a pas trouvé mieux que:

var queryExpression; 
if (c["ColName"]=="CreateDate") 
    queryExpression.OrderBy(x => x.CreateDate); 
+0

En fait, je crois que veut juste être si (ColName == "CreateDate") ' –

0

Espérons que cela fonctionnera aussi bien que non testé

Context.AccountCharts.Where(c=>c.Account_FK == account && c.Year_FK == year).OrderBy(o=>o.order);