問題のコードは下記。
1 2 3 4 5 | var list = doc.Descendants( "Row" ).Select(x => new { Original=x, Text=x.Element( "FirstName" ).Value + x.Element( "LastName" ).Value + x.Element( "Address" ).Value }) .Where( "Text.Contains(@0)" , new string []{ "何か" }).ToList(); |
上記は意味の無いDynamic Linqの使い方だがサンプル目的なので分かりやすく記述している。上記のコードを実行するとContainsの部分でMethodAccessExceptionがThrowされる。どうやらAnonymousクラスのプロパティに対してReflectionから実行しようとすると駄目なようだ。回避方法は下記の通り。
1 2 3 4 5 6 7 8 9 10 11 | public class TemporaryDataHolder { public XElement Original { get ; set ; } public string Text { get ; set ; } } var list = doc.Descendants( "Row" ).Select(x => new TemporaryDataHolder { Original=x, Text=x.Element( "FirstName" ).Value + x.Element( "LastName" ).Value + x.Element( "Address" ).Value }) .Where( "Text.Contains(@0)" , new string []{ "何か" }).ToList(); |
一時的にデータを保持するクラスを定義して、それをAnonymousクラスの代わりにインスタンス化すればよい。なんだかなぁ、という感じだがDynamic Linqが処理の重要な部分を占める場合は致し方ない。
0 件のコメント:
コメントを投稿