2010年9月15日水曜日

Dynamic LinqをLinq To Xmlで使うときの注意点 in Silverlight

Linq To SQLでDynamic LINQを良く使っていたのだが、先日Silverlight上でLinq To Xmlを同じように使ったところ結構はまったので紹介しておく。

問題のコードは下記。

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 件のコメント:

コメントを投稿