silverlightで業務アプリその2
silverlightで業務アプリを作るとなると、DBへのアクセスをどうするかという問題が出てくる。
silverlightはDataSetが使えないので、Linqでデータを取得するのが正しいのだろうが、Linq to SQLやLinq to Entitiesはoracleに対応していない。silverlightからoracleを使うにはどうしたら良いか。
今ちょっと検索したら、DbLinqというオープンソースのものが使えるらしいのだが、silverlightの案件に取り掛かった最初の頃に調べたときはこれを見つけられなかった。今ちょっと検索しただけですぐ見つかったものが、仕事で必死に探していたときになぜ見つからなかったのかは謎だが、見つからなかった私はどうしたかというと、こんな手順を考えた。
- webサーバ側でADO.NETを用いてDataSetにデータを取得し
- DataSet.WriteXML()を用いてXMLに変換したものを、webサービスの戻り値としてstring型でクライアントに返し
- silverlightのクライアントアプリケーションはLinq to XMLで取得
具体的にコードを書くと、silverlightでLinq to XMLによってデータを取得する部分は以下のようになる。
// xmlDataというstring型変数に、サーバから返されたXMLデータが格納されているものとする。 XDocument xDoc = XDocument.Parse(xmlData); var dataVar = from tempTable in xDoc.Descendants("DATA_TABLE") select new DataClass { Col1 = (string)tempTable.Element("COL1"), Col2 = (string)tempTable.Element("COL2") };
ここで、サーバが返すデータは、DataSet内に"DATA_TABLE"という名前のDataTableが存在し、そのDataTableは"COL1", "COL2"というDataColumnを持つものであるとする。
また、Silverlight側で、クラスDataClassの定義をしておく必要がある。
public class DataClass { public string Col1, public string Col2 }
以上。DbLinqを知っていればそちらを使うべきだったのかもしれないが、上記のやり方だと、取得するデータの条件をwhereで絞り込むなどの複雑な処理はSQLでやって、Linqの構文は複雑にならずに済む。今回私が携わったプロジェクトは私も含めて業務でLinqを使うのは初めてのメンバーが多かったので、Linqの構文が単純で済むこのやり方を採用したことで、結果的に開発効率が向上したのではないかとポジティブに考えることにする。