2016-08-07 4 views
2

匿名型のシーケンスを生成するlinqクエリがあります。クエリは次のように定義されています一連の匿名型を生成するlinqクエリのグローバル変数を宣言する方法

var query = from a in Db.Table1 
    join b from Db.Table2 
    join... 
    ... 
    select new { 
    a.field1, a.field2, 
    b.field1, NewName = b.field2 }; 

今、私は次のシナリオでは、このクエリを使用したいと思います:

if (x == 1) 
{ query = ... 
    ...rest of code_1 } 
if (x == 2) 
{ query = ... 
    ...rest of code_2 } 

最初の異なるテーブルを使用します「の場合」、合流どこの文から「QUERY」 2番目の 'if'からのクエリよりも、両方が正確に同じ 'select new'ステートメントを持ちます。

これを行うには、変数 '照会'を宣言する必要があります。これは 'if'ステートメント内で表示されます。私が使用して「クエリ」の「種類」を確認

:私は唯一の内側に書くことができるよう

query type = 'System.Data.Objects.ObjectQuery`1[<>f__AnonymousType7`14[System.Int32,System.String,System.String,System.String,System.Nullable`1[System.DateTime],System.Decimal,System.Nullable`1[System.DateTime],System.Decimal,System.String,System.String,System.String,System.String,System.String,System.String]]' 

は、私は別のクラスを宣言することはできません。

query.GetType().ToString(); 

それは私を与えます私がコードを書いている方法。 'クエリ'変数はどのように宣言する必要がありますか?

+0

あなたは非ジェネリック '' IQeuryable'or dynamic'を使用することができます。 – Michael

+0

あなた自身のために問題を作成するだけで多くの問題があるようです。 –

+0

IQueryableでは、後で使用できないif(query.Count()> 0) - そうですか? – phoenix

答えて

1

私が見る唯一の方法は、次のようにを使用して、それを定義することです:field1field2などが内部に使用される正確な順序で、彼らの実際の型を使用して、具体的なプロパティ名でなければなりません

var query = Enumerable.Repeat(new 
{ 
    field1 = default(int), 
    field2 = default(string), 
    field3 = default(string), 
    // other fields ...   
}, 0).AsQueryable(); 

内側が選択されます。

+0

フィールド1、フィールド2などはちょうど「いくつかの」フィールドです。私はa.field1の名前/属性がb.field1と同じであることを意味しませんでした。しかし、私はあなたのポイントを得る...と私はそれを認識しています。 – phoenix

+0

申し訳ありませんが、これは私が考えていたものです。しかし、私は一致する例を作るための具体的な名前/タイプが必要でした。とにかく、私はあなたがポイントを持っていると思う、私は答えからその部分を削除します。 –

+0

あなたのソリューションは私のために完璧に働いていることに言及しておきます! – phoenix

0

この解決策の続きとして、動的な「where」ステートメントを使用する可能性について質問したいと思います。これを検索するとき、PredicateBuilderクラスに基づいてソリューションに何度もリダイレクトされましたが、これにはQuery SyntaxではなくMethod Syntaxが必要です。私はラムダにクエリを変換する必要がありますか、これを達成する別の方法がありますか?

私の(私はすでにいくつかの「場所」の条件を持っているように)「」の追加ステートメントは、のようになります。

where 
(a.field1 = a[0] and b.field1 = b[0]) || 
(a.field1 = a[1] and b.field2 = b[1]) || 
(a.field1 = a[2] and b.field2 = b[2]) || 
.... 
(a.field1 = a[a.Length] and b.field2 = b[b.Length]) 
関連する問題