2008-09-10 6 views
12

私は複数の場所から呼び出したいLINQクエリを持っている:メソッドから匿名型を返すにはどうすればよいですか?

var myData = from a in db.MyTable 
      where a.MyValue == "A" 
      select new { 
          a.Key, 
          a.MyValue 
          }; 

は、どのように私は、メソッドを作成し、その中にこのコードを配置し、それを呼び出すことができますか?

public ??? GetSomeData() 
{ 
    // my Linq query 
} 
+0

は、なぜあなたは発声を返さないのですか? –

+1

これは単なる例にすぎません。私は辞書に収まらない実際に選択しているより多くの値を持っています – ScottG

+0

[匿名型を返しますか?](http://stackoverflow.com/questions/534690/return-anonymous-type) – nawfal

答えて

9

IQueryableとIEnumerableの両方が機能します。しかし、タイプ固有のバージョンIQueryable < T >またはIEnumerable < T >を使用したいとします。

データを保持するタイプを作成したいと思うでしょう。

var myData = from a in db.MyTable 
      where a.MyValue == "A" 
      select new MyType 
      { 
       Key = a.Key, 
       Value = a.MyValue 
      }; 
+0

このソリューションを拡張することに感謝します。キーは特定のタイプを使用していました。これはうまくいく – ScottG

+0

ちょっと私はその答えを1時間beforダーレンを与えた。サンプルを与えないと私にはうまくいきます:) –

+0

明確にするために、選択された新しい{...}は匿名型を作成します(varキーワードを使用する必要があります)。この型は名前を持たず、リフレクションを使用しない限り、作成したメソッドでのみローカルで使用できます。外部で使用するには、名前付きの型を作成する必要があります。 – Lucas

7

IQueryable

だからあなたのメソッド宣言では、あなたが戻りたい場合は、タイプを必要とする

public IQueryable GetSomeData() 
+0

ありがとう!それは大いに役立ちます/ – ScottG

+2

これを行うことによって、インテリセンスを持たず、リフレクションを通してアイテムのプロパティにしかアクセスできません。 –

+1

クエリがまだ実行されていないことに注意してください。 –

2

ようになります。

varの代わりにIEnumerable<>を使用して宣言し、その変数を返します。それを反復すると、実際にクエリが実行されます。

3

一般的な方法は、あなたのインテリセンスを与える必要があります。

public class MyType {Key{get;set;} Value{get;set}} 

public IQueryable<T> GetSomeData<T>() where T : MyType, new() 
{ return from a in db.MyTable 
      where a.MyValue == "A" 
      select new T {Key=a.Key,Value=a.MyValue}; 
} 
関連する問題