Windows Azure TableでCRUDアプリケーションを作っていると、結構Azureでの課題というか、はまりどころが見えてきました。せっかくなのでいくつかメモしておきます。
実装されていないLINQメソッドが多い
TableStorageDataServiceContextで弄るデータアクセス以下のメソッドが実装されていません。が、OrderByがらみが実装されていないのは痛いよなぁ…。この辺りはどうしたら良いものだろうか…。
- Single
- SingleOrDefault
- OrderBy
- OrderByDescending
- Count
- Min
- Max
- Average
Partition Keyを更新しようとすると例外が発生する
Windows Azure TableにアクセスするクラスはMicrosoft.Samples.ServiceHosting.StorageClient.TableStorageEntityを継承する必要がありますが、当該クラスには以下3つの必須プロパティが存在します。
- Timestamp
- Partitionkey
- RowKey
PartitionKeyが何物かは【MS tech・days】Windows Azureのストレージ機能はクラウドを考慮した仕組みにを参照して頂くとして、こいつを更新する処理を入れると以下の例外出ますのでご注意を。まぁ、PartitionKeyが何物かをちゃんと確認すれば、当たり前な事と言えますが…。
'System.ArgumentException' の初回例外が System.Data.Services.Client.dll で発生しました。 System.ArgumentException: コンテキストは現在エンティティを追跡していません。 パラメータ名: entity 場所 System.Data.Services.Client.DataServiceContext.UpdateObject(Object entity) 場所 MvcTableApp.Models.CommentRepository.UpdateComment(Comment comment) 場所 C:\my_program\CSharp\ProjectsCloud\CloudServiceTableMvc\MvcTableApp\Models\CommentRepository.cs:行 85 場所 MvcTableApp.Controllers.HomeController.Edit(Comment comment) 場所 C:\my_program\CSharp\ProjectsCloud\CloudServiceTableMvc\MvcTableApp\Controllers\HomeController.cs:行 93 'RdRoleHost.exe' (マネージ型): 'C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\9.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll' が読み込まれました
時系列に対する参照系の取得について
上記で記述した通り、OrderByメソッドが存在しないため、以下のような記述の仕方ができません。
return _dataContext.Comments.OrderBy( comment => comment.Timestamp ).Take(count).ToList();
だからと言って、以下のような記述をするのはレコード数が増えた場合に性能問題が出るしなぁ…。
return _dataContext.Comments.ToList().OrderBy( comment => comment.Timestamp ).Take(count).ToList();