スキーマレスの Azure Table Storage では、文字列のContainsを使ったQueryはサポートしないようですね。(ただし StartsWith は CompareTo を応用することで使えるらしい…)

Linq to Azure Table では普通に書けるので、ダメもとで下記のコードを試してみたのですが、500 Error が返されるため、ちょっと調べてみました。

var query = from t in this.CreateQuery(EntitySetName)
            where (t.PartitionKey== ProductTable.PartitionKey) && t.Tags.Contains(tag)
            select t;

return query.ToList();

MSDNを漁ってみると、下記のような投稿が見つかりました。
LINQ SubString Query Using Azure Table Storage…

また下記のBlog記事を見るように提案されています。
Implementing a Simple Word Search Using Azure Table Storage

結局のところ、部分文字列の検索に関しては、自前でインデクス化したテーブルを別途作ってやるのが早道のようですね。確かに理にかなっています。

今回の(僕の)用途では、タグ付けされたアイテムを抽出するだけですから、アイテムの登録・更新時に、検索用テーブルにアイテムを登録してやることで実装したいと思います。

今回は、ASP.NET MVC 2 が自動生成する View (Webフォーム) にて、各項目のラベル表示を変更する方法について調べてみました。

まず、View を追加するまでの方法については、MSDN の下記の記事が参考になりました。
10 行でズバリ !! ASP.NET MVC におけるデータの取得から画面表示までの流れ (C#)

上記を参考にしつつ、Azure Table ストレージに作ったテーブルに、TableServiceEntity の派生クラスを挿入するコードまでは、簡単に書く事ができました。

でも、このままだと、下記のように、変数名がそのまま表示されちゃうんですよね。

image image
こんなコードが自動生成される。 こんな感じで 変数名 が表示される。

 

解決方法としては… なんかググったら下記のプレゼンテーションがヒットしました。 (^_^;
ASP.NET MVC 2 ~新機能の紹介~
上記は 技術ひろば.net 様が公開して下さっているようです。ありがとうございました。

要するに LabelFor() の処理では 、Windows Form の PropertyGrid と同様、System.ComponentModel 名前空間にある DisplayName 属性の値を表示しているんですね。

using System.ComponentModel;
  :
[DisplayName("画像 (サムネ)")]
public string ImageSmall { get; set; }          // 画像(小)
[DisplayName("画像 (詳細)")]
public string ImageLarge { get; set; }          // 画像(大)

という訳で、表示対象のクラス定義にて、上記のように DisplayName 属性を加えてやったところ、無事に下記のような表示になりました。簡単ですねぇ。

image

通常の用途なら、このあたりで十分かもしれません。めでたし、めでたし。

ただ、多言語対応を考慮すると、下記のように DisplayAttribute の派生クラスを自前で定義するほうが良いかもしれませんね。 -> Localization of DisplayNameAttribute

さて次回は、この調子で多言語対応について調べてみたいと思います。