2012-03-21 22 views
0

最初の質問 - 私はそれを何度も読んで、何度も落ち込んで、自分の足をコミュニティに濡らしました!Linq - 文字列から値を取得する

私はLINQクエリから単一の行を取得することによって開始:

var relationshipDetails = (from p in dc.tbl_ClientRelationships 
          where p.ID == relationship_id 
          select p).FirstOrDefault(); 

それから私は、文字列のリスト(_cols)に目を通す知られているカラム名である(とも項目名を形成する)ので、のような:

foreach (string c in _cols) 
    { 
     if (relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString() != null) 
     { 
      setValue(relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString(), c); 
     } 
    } 

setValue()方法は、基本的には、WebBrowserコントロールに戻り値を代入(種類およびどのように割り当てられるべき等を決定するためのロジックを有している..)

私の質問は、知っているプロパティ値からLinqオブジェクトの値を取得する良い方法はありますか? これはいくつかのフォームで動作しますが、最近私を爆破しました!

それ以外の場合は、古い方法に戻るか、DataRowをDALから返信して、簡単に名前で参照するように誘惑されます。事前に

おかげで、 マーク

+5

C#は "爆発"しませんが、例外をスローします。例外には、他の情報の中には、型、メッセージ、およびスタックトレースが含まれます。 – Jon

+0

はい、より良い方法が本当に必要です。ループ内でReflectionを使用しています。それはコストのかかる作業です専門家の回答を待っていません – Zenwalker

+0

タイプセーフティを捨てようと積極的に取り組んでいますか? – asawyer

答えて

1

まず:

var relationshipDetails = (from p in dc.tbl_ClientRelationships 
          where p.ID == relationship_id 
          select p).FirstOrDefault(); 

LINQクエリは、クエリを表すオブジェクトをされ、それらを分離しておくと、これらのクエリの結果は異なります。この場合、私の代わりにこのような何かをお勧めしたい:

var relationshipDetails = dc.tbl_ClientRelationships 
           .FirstOrDefault(p => p.Id == relationship_id); 

は今、これは非常に遅いことになるだろう:

foreach (string c in _cols) 
{ 
    if (relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString() != null) 
    { 
     setValue(relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString(), c); 
    } 
} 

あなたは簡単に反射部材への参照を取得し、ダウンにカットすることができますオーバーヘッドはおそらく次のようなものです:

var properties = relationshipDetails.GetType().GetProperties(); 

foreach (string c in _cols) 
{ 
    var currentProperty = properties.Single(p=> p.Name == c); 

    if (currentProperty.GetValue(relationshipDetails, null) != null) 
    { 
     setValue(currentProperty.GetValue(relationshipDetails, null).ToString(), c); 
    } 
} 

最後に - なぜあなたはこれをやっていますか?あなたが何をしようとしているのか正確に記入し、タイプセーフな名前付きの方法で列を参照するのはなぜですか:

relationshipDetails.Id = ... 
relationshipDetails.SomethingElse = ... 
relationshipDetails.AnotherThing = ... 

あなたのケースでは機能しません。

+0

ありがとうございました、または詳しい解答、今試してみます。理由は次のとおりです。マークアップには、テキストボックス、チェックボックス、ドロップダウンリストなどのコントロールがあります。これらはすべて、データベースの列名の後に名前が付いています。フォームがロードされると、Webコントロールをループし、列名のリストを作成します。これらを使用して、SQLの更新と挿入を作成できます。データをロードする際には、問題のカラム名があるので、照会されたオブジェクトを参照するだけで済みます。私はこのために古いデータローに固執すべきですね。 – RemarkLima

+0

'全部にデータベースの列名が付いた名前が付いています.'あなたのページを読み込んだ人にあなたのデータテーブルに関する詳細なスキーマ情報を公開してもよろしいですか?コードレビューでこの問題が発生した場合は、これに反して強くお勧めします。 – asawyer

+0

これは何らかの理由で 'FormView'を再作成しようとしているようです。 http://msdn.microsoft.com/en-us/library/fyf1dk77(v=vs.85).aspx – asawyer

2

(私の意見では)Linqの(Sql/Entities)に対する最大の利点の1つは、返されるオブジェクトがstrongly-typedであるということです。あなたLinqToXを使用しているし、値を割り当てるために反射を使用して、あなたは基本的に古い学校DataRow何をやっている。

なぜ動的に値を割り当てようとしているのかわかりません。これは間違いなくXY Problemです。

+0

すべてが始まっています!私はLinqと一度も仕事をしたことがないので、立ち往生する時だと思った!このような情報は非常に貴重です。それは、古い方法のいくつかがやっている "Linqはすべてを行う!"と誇大宣伝に夢中になるのは簡単です。 – RemarkLima