2011-10-22 5 views
10

私は2つのテーブル、Table1Table2を持っています。あなたが気づくことができたようLINQでJOINの後にすべての列を選択

var myOutput = from object1 in Table1 
       join object2 in Table2 
       on object1.Property1 equals object2.Property2 into Table3 
       from output in Table3.DefaultIfEmpty() 
       select new 
        { 
         object1.Property1, 
         object1.Property2, 
         //... 
         output.Property3, 
         output.Property4, 
         //... 
        }; 

が、私は結果のテーブルから両方のオブジェクトのすべてのプロパティを(参加中に考慮さenumerablesは、特定の種類のオブジェクトを含む選択したい:私は左外部結合、たとえば、実行したいです - これらは両方の関係で異なる)。もちろん、例に示すように、匿名選択のプロパティを選択できます。

私の質問は、すべてのプロパティを手動で指定しないようにする方法です。私はSELECT * FROM TABLE3のようなものを持っています。TABLE3は結果として得られる関係です(TABLE1TABLE2を結んだ後)。

事前に感謝の手紙をありがとうございます。

答えて

10

フラット型に投影する場合は、それぞれを手動で指定する必要があります。あなたの他の選択肢は、あなたの複合型に両方のオブジェクトが含まれるようにすることだけです。オブジェクトは自然にそのプロパティに沿って移動します。

select new 
{ 
    Object1 = object1, 
    Object2 = output 
}; 

そして、あなたはmyObj.Object1.Property1myObj.Object2.Property4のようにそれに取り組むだろう、など

まだいくつかの手作業を必要とする一つの最後のオプションは、適切なタイプを定義し、コンストラクタまたはないビルダーメソッドを持つことですオブジェクトのプロパティをフラット化されたタイプにセグメント化する作業。手動マッピングは引き続き実行しますが、クエリロジックから分離します。

select new CombinedType(object1, output); 
//or 
select builder.GetCombinedType(object1, output); 
+0

最初のオプションでは、割り当て中にToString()メソッドを使用しませんか?その場合、myOutput.ToArray()を実行した後、Object1という名前の列にインスタンス「Namespace.MyType」の値を取得します... – Jamie

+0

いいえ、ToString()を呼び出さないでしょう。 ?あなたはそれをある種のUIコントロールにバインドしていますか? * control *は 'ToString()'を呼び出すかもしれませんが、それは本物のクエリそのもので、単にオブジェクト全体を使い、それをプロパティにマップします。 –

+0

あなたのコメントは私に考えを与えました - 私は両方のオブジェクトの参照を含む新しいクラスを作った。次に、これらの特定のプロパティにバインドするのは簡単です:) – Jamie

関連する問題