問題のコードは下記。
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 件のコメント:
コメントを投稿