web-dev-qa-db-ja.com

LINQ to SQLを使用するC#メソッドから匿名型を返す方法

可能性のある複製:
LINQ to SQL:匿名型を返しますか?

匿名型(さまざまなデータ型のデータの約6列を含む)としてデータを返す標準のLINQ to SQLクエリがあります。

メソッドの呼び出し元に返すか、メソッドを含むオブジェクトのプロパティに割り当てることにより、この返されたオブジェクトをプログラムの他の部分で利用できるようにしたいと思います。

匿名型( "var")である場合、これをどのように行うことができますか?

編集-コードは次のとおりです。

    using (ormDataContext context = new ormDataContext(connStr))
    {
        var electionInfo = from t1 in context.elections
                   join t2 in context.election_status
                   on t1.statusID equals t2.statusID
                   select new { t1, t2 };
    }
44
alchemical

匿名型をクラスにします...

public class Person
{
    public Person() {
    }

    public String Name { get; set; }
    public DateTime DOB { get; set; }
}


Person p = 
    from person in db.People 
    where person.Id = 1 
    select new Person { 
        Name = person.Name,
        DOB = person.DateOfBirth
    }
65
user110714

C#でメソッドを入力して、匿名型の明示的な型にすることはできません。それらはいわば「名前」を付けることができず、したがってメタデータ署名に表示することはできません。

匿名型の値を本当に返したい場合、2つのオプションがあります

  1. メソッドの戻り値の型をSystem.Objectにしてください。次に、悪意のあるハッキングを実行して、別のメソッドで型指定された値を取得できます。これはvery壊れやすいため、お勧めしません。
  2. ジェネリックメソッドと型推論のトリックを使用して、戻り値の型を正しく取得します。これには、アプローチに非常に興味深いシグネチャ定義が必要になります。

匿名型は、この方法で実際に渡されることを意図していませんでした。この方法で関数間でそれらを渡す必要がある時点で、明示的に型を定​​義する方が良いでしょう。

19
JaredPar

Varを使用しても匿名型にはなりません。 varを使用するということは、この変数を代入の右側で使用可能なタイプにすることを意味します。短い手です。右側のものが実際のクラスである場合、変数はその型になります。

例えば:

var person = new Person { Name = "bob" };

Person変数は、varキーワードを使用していてもPerson型です。

匿名型は、新しい{Name = ...}を使用して作成されます。この場合は、新しい匿名クラスです。割り当てることができるのは、使用する既存の名前がないため、var(またはオブジェクト)を使用して定義された変数のみです。

例えば:

var person = new { Name = "bob" };

この場合、personは実行時に定義された匿名型です。

通常、@ Chalkeyが言うように、結果を別のメソッドに渡す場合は、匿名ではなく名前付きの型を使用します。

匿名型を使用する必要がある場合は、Object型のオブジェクトとして返してから、リフレクションを使用してそのプロパティを取得する必要があります。

6
tvanfosson

Jon Skeetはこれを行う方法についてブログを書きました。これは 恐るべきGrotty Hack というタイトルです。タイトルが示すように、匿名型を返す方法を探しているべきではありません。代わりに、この機能を実装する正しい方法であるため、返される型を作成する必要があります。

したがって、返される型の具体的な定義を作成し、それをクエリで返すように設定することをお勧めします。

5
Jeff Yates

それは、呼び出し元のコードがどのようにデータを使用するかに依存します。

単純なデータバインディングを行っている場合、実際に型を気にしない(つまり、C#コードのプロパティに明示的にアクセスする必要がない)場合、結果をIEnumberableとして返すことができます。

ほとんどのデータバインディングの場合、とにかくマジックストリングを介して名前でプロパティを呼び出しているので、とにかく正確なタイプは関係ありません。

それ以外の場合は、匿名タイプを名前付きタイプに変換する必要があります。

2
Chris Brandsma

大きなアプリで結果を渡す必要がある場合は、辞書を使用できます。はい、キャストする際にいくらかのオーバーヘッドがありますが、少なくともオブジェクトを捨てることを減らしています。

0
David Robbins