2010年9月15日水曜日

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

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

問題のコードは下記。

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

コメントを投稿