問題のコードは下記。
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から実行しようとすると駄目なようだ。回避方法は下記の通り。
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 件のコメント:
コメントを投稿