2011-08-14 20 views
3

クラスに列名を渡して、その列の値をSQLデータベースから取得しようとしています。フィールド<>はテーブルでは使用できませんが、DataTableでは機能します。誰かが私にどのようにlinqを使ってそれをすることができますか?私はそれがとても簡単なことだと確信しています。ありがとう。Field <> With Linq to SQL

[Table(Name = "[Keys]")] 
public class Keys 
{ 
    [Column] 
    public string Column_A{ get; set; } 
    [Column] 
    public string Column_B{ get; set; } 
    [Column] 
    public string Column_C{ get; set; } 
} 

    public string ReadKey(string DBKey) 
{ 
    DataContext dc = new DataContext(sqlconn); 
    Table<Keys> keysTable = dc.GetTable<Keys>(); 

    var query = from k in keysTable.AsEnumerable() 
    select k.Field<string>("DBKey");  <---------------- wrong 

} 

答えて

3

Field<>でのDataTableにLINQするためのものであり、System.Dataへの拡張として含まれます。標準のLINQ拡張メソッドではありません。 LINQ to DataTablesの使い方に関するこのような質問を参照してください。

何をしようとしているかは、式、またはDynamic LINQを使用して達成できます。動的LINQは.NETに同梱されているものの一部ではありません。それはVS2008に例として含まれ、人々はそれを使い続けました。私はそれがMicrosoftによってサポートされ、更新されているかどうかはわかりません。それがフレームワークに組み入れられるまで、私はそれを期待しません。

次のようなジョンの答えで述べたselectorを作成する方法を作成することができます。

public Expression<Func<Keys,T>> GetSelectLambda<T>(string propertyName) 
{ 
    ParameterExpression lhsParam = Expression.Parameter(typeof(Keys), "s"); 
    Expression fieldParam = Expression.Property(lhsParam, propertyName); 
    var theExpression = Expression.Lambda<Func<Keys, T>>(fieldParam, lhsParam); 
    return theExpression; 
} 

のでGetSelectLambda<string>("DBKey")に渡すと、その後、Jonのメソッドに返され、渡されs => s.DBKeyのラムダを、生成する必要があります。

これが役に立ちます。

+0

ありがとうございました! – Gary

+0

私は助けてよかった。 –

2

あなたは、一般的にSQLにLINQでカラムを使用してはならない - 型なしDataTableオブジェクトを使用して上でLINQ to SQLの利点の一つは、あなたがより多くのコンパイル時の安全性を得ることです。あなたは別の列を選択することができるようにする必要がある場合は

、あなたはそれらを選択するために、式ツリーを使用することができます。GetTableを使用してまれ素晴らしいアイデアであることを

public string ReadKey(Expression<Func<Keys, string>> selector) 
{ 
    DataContext dc = new DataContext(sqlconn); 
    Table<Keys> keysTable = dc.GetTable<Keys>(); 

    // Generally speaking you don't want to use AsEnumerable here... 
    var query = keysTable.Select(selector); 
    // Now do something with query 
} 

注 - 通常、あなたが仕事だろうが特定のテーブルDataContext

+0

素晴らしい!それは最終的に動作します。どうもありがとう! – Gary