2008-11-14 50 views
2

我试图建立一个方法,将收到一个Linq表,并且应该返回一个列表<>的值将是一个DropDownList数据源。我该如何做一个动态的Linq2SQL查询?

这是我得到了什么至今:

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

什么,我不知道该怎么办是,查询该表只获得了字段传递(ValueField,文本字段)...

Tks!

+0

我强烈建议你改变问题的标题为更有意义的那么 “LINQ2SQL帮助。” – 2008-11-14 13:37:00

回答

0

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

还检查了斯科特Gutherie的博客系列here

+0

Table.Select(T =>新Structs.NameValuePair(t.field1,t.field2))。ToList() - 更好。 – 2008-11-14 14:17:35

+0

丹,你看过我的回答吗? ;) – CodeChef 2008-11-14 14:23:14

+0

哎呀,不...现在虽然 - 这是一个很好的... +1! – 2008-11-14 14:28:51

1

为什么不只是做类似的事情;

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

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

希望这可以帮助,我真的不认为你需要创建一个while方法。但如果你想我会说它需要一个IDictionary对象,并从那里转换它。

+0

我认为他需要能够在运行时以字符串形式提供“Key,Value”字段名称。 – 2008-11-14 14:00:58

0

你试图做一些事情像你的方法

GetDropDownItems(“盖茨”,“姓氏”)以下????

如果是这样,作为SDK的一部分包含样本是一个名为DynamicQuery的项目。使用这个你可以基本上创建你想要的查询的文本版本。你可以这样做

“姓氏==‘盖茨’”

但是,它也很容易建立自己的表达式树。了解表达式树的外观是使用ExpressionTreeVisualizer VS调试器添加的最佳方式(注意,这也是SDK CSharpSamples中包含的另一个示例)。这将是类似于

ParameterExpression parameter = Expression.Parameter(typeof(T),“x”); var expression = Expression.Equals(Expression.Property(parameterName,“LastName”),Expression.Constant(“Gates”)

3

将您的LINQ2SQL查询的结果投影到System.Collections.Generic.KeyValuePair对象中,像这样:


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

然后,您将要设置的DataValueField和DataTextField上的DropDownList为“重点”及“值”属性

0

如果“关键”和“价值”是代表名称的字符串。您希望获得的属性,并且只在运行时才知道它们...以下是您的代码:

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; 
}