Scott Guthrie がここで説明している Dynamic Linq Library を使用しています。
Scott Guthrie の例は素晴らしく、私は動的 Where ステートメントをかなり使用しました。
しかし今、動的選択機能を使用する必要がある状況に直面しています。Scott Guthrie は、この機能のスクリーンショット (記事の最後のスクリーンショット) を示していますが、非常に巧妙に説明していません。
問題は、コードがコンパイルされて実行されたとしても、それが有用な方法でどのように機能するかがわからないことです。おそらく反射で?
以下に例を示します (Guthrie が上記の記事で説明している Dynamic Linq Library を使用する必要があります。これは通常の Linq System.Linq ではありません)。
ここのサンプルでは、UserId、FirstName、および LastName フィールドを持つ Users テーブルがあります。しかし、どのデータベースを使用するかは問題ではありません。この問題は非常に簡単に再現できます。ここに私のサンプルコードがあります:
最初に、この using ステートメントが一番上にあることを確認してください。
using System.Linq.Dynamic;
次に、次のコードを実行できます。
using (DataClasses1DataContext dcdc = new DataClasses1DataContext())
{
var x = dcdc.Users.Select("new(UserId, FirstName, LastName)");
foreach (var item in x)
{
Console.WriteLine(item.ToString());
}
}
ご覧のとおり、これは問題なくコンパイルおよび実行されます。データベースからすべてのレコードを取得します。ただし、新しい匿名型のメンバーに実際にアクセスする方法はありません。
Select クエリは文字列であるため、設計時に型の推論は行われません。だから私は書くことができません:
Console.WriteLine(item.UserId);
コンパイラは、匿名型アイテムに UserId という名前のメンバーがあることを認識していません。そのため、コードはコンパイルされません (For..Each ループ中にデバッガーを一時停止しても、デバッグ ウィンドウに UserId、FirstName、LastName メンバーがあることがわかります)。
それで...これはどのように機能するはずですか?匿名型のメンバーにアクセスするにはどうすればよいですか?