2008-11-14 6 views
2

J'essaye de construire une méthode qui recevra une table de Linq, et devrait renvoyer une liste <> de valeurs qui seront une source de données de DropDownList.Comment faire une requête Linq2SQL dynamique?

C'est ce que j'ai jusqu'à présent:

public static List<Structs.NameValuePair> GenDropDownItens<T>(string ValueField , string TextField) where T: class 

Ce que je ne sais pas comment faire est, interroger la table obtenir uniquement les champs qui sont passés (ValueField, TextField) ...

Tks!

+0

Je vous suggère fortement de changer le titre de votre question à quelque chose de plus significatif, puis "Aide Linq2SQL." –

Répondre

0

Table.Select (t => t.field1, t.field2)

Consultez également la série de blog de Scott Guthrie here.

+0

Table.Select (t => new Structs.NameValuePair (t.field1, t.field2)). ToList() - Encore mieux. –

+0

Dan, as-tu lu ma réponse? ;) – CodeChef

+0

Oops, Non ... Avons maintenant - c'est un bon ... +1! –

1

Pourquoi ne pas simplement faire quelque chose comme;

var dropDownValues = dataContext.SomeTable.ToDictionary(
    s => s.Name, 
    s => s.Value 
); 

foreach(var item in dropDownValues) { 
    var OptionName = item.Key; 
    var OptionValue = item.Value 
}; 

J'espère que cela aide, je ne pense vraiment pas que vous ayez besoin de créer une méthode while. Mais si vous voulez je dirais qu'il faut prendre un objet IDictionary, et le convertir à partir de là.

+0

Je pense qu'il doit être en mesure de fournir les noms de champs "Key, Value" en tant que chaînes à l'exécution. –

0

Essayez-vous de faire quelque chose comme ce qui suit avec votre méthode

GetDropDownItems ("Gates", "LastName") ???? Si tel est le cas, un projet appelé DynamicQuery est inclus dans les exemples du kit de développement logiciel (SDK). En utilisant cela, vous pouvez créer une version texte de la requête que vous voulez. Vous pouvez faire quelque chose comme

« LastName == « Portes » »

Cependant, il est tout aussi facile de construire vous-même l'arbre d'expression. La meilleure façon d'apprendre à quoi ressemble l'arborescence des expressions est d'utiliser le débogueur VS d'ExpressionTreeVisualizer (notez qu'il s'agit également d'un autre exemple contenu dans le SDK CSharpSamples). Ce serait quelque chose comme

ParameterExpression parameter = Expression.Parameter (typeof (T), "x"); expression var = Expression.Equals (Expression.Property (paramètre, "LastName"), Expression.Constant ("Gates")

3

projet le résultat de votre requête LINQ2SQL dans un objet System.Collections.Generic.KeyValuePair comme si :


ddl.DataSource = DataContext.Table.Select(o => new KeyValuePair<string, string>(o.ID, o.DisplayField)); 
ddl.DataBind(); 

Vous voulez ensuite définir la DataValueField et DataTextField attributs sur le DropDownList à « clé » et « valeur » respectivement

+0

CORRECTION: Le lambda dans le select devrait être: o => new KeyValuePair (o.ID, o.DisplayField) – CodeChef

+0

Parfois, il est amusant de penser à ces choses. Vous pouvez peut-être projeter votre requête directement dans un objet System.Web.UI.WebControls.ListItem. Cela peut vous éviter d'avoir à définir les attributs sur DropDownList. Je n'ai pas essayé ceci cependant - laissez-moi savoir si vous l'essayez et cela fonctionne. – CodeChef

+0

@CodeChef: ajouté les entités HTML lt/gt pour que votre réponse apparaisse correctement – user7116

0

Si « clé » et « valeur » sont des chaînes qui représentent le nom. des propriétés que vous souhaitez obtenir, et ils ne sont connus qu'à l'exécution ... voici votre code:

private static Func<T, DictionaryEntry> GetNameValuePairFunc<T>(string valueField, string textField) 
{ 
    Func<T, DictionaryEntry> result = (item) => 
    { 
     object key = typeof(T).GetProperty(valueField).GetValue(item, null); 

     object text = typeof(T).GetProperty(textField).GetValue(item, null); 

     return new DictionaryEntry(key, text); 
    }; 

    return result; 
} 
+0

Si le problème consiste simplement à modifier les champs liés à la clé et au texte DropDownList, pourquoi ne pas simplement lier l'objet LINQ et utiliser les attributs DataValueField et DataTextField dans DropDownList? – CodeChef

+0

C'est un excellent point ... et c'est ce que * I * ferait. Mais je devine/espère qu'il y a plus à cela que nous ne savons pas :) –

Questions connexes