以前 (といっても2,3年前くらいですが)、XPOにSQLを直接実行する機能が
追加された際に以下のような記事を書いていました。
- DevExpress奮闘記-060 (XPOがダイレクトSQLクエリに対応, v2010 vol.2, 新機能)
- DevExpress奮闘記-067 (XPOのDirect SQL QueriesとLinq To XPOについて)(v2010 vol2, Linq To XPO, Direct SQL, ExecuteQuery, GetObjectsFromQuery)
このとき、自分でその機能を試していて以下の点が無理でした。
- LINQ to XPOにて、joinが利用できない
- パラメータクエリが利用できない (SQLを指定できるだけ)
2年も経つとちょっと事情が変わっていたので再度追記です。
まず、LINQ to XPOにてjoinが利用できなかった件ですが
これは、v2012 vol.1にて利用できるようになっています。
(まだ、試していませんが。)
- LINQ to XPO Improvements
次に、パラメータクエリが利用できない件ですが
これ、先日たまたまExecuteQueryのドキュメントを見てたら、いつの間にかオーバーロードメソッドが
増えていましたw 以前、サポセンに聞いたときは、サポート予定無しって言われたんですけどね・・・。
探してみたら、こんなチケット発見。v2012 vol 1.2で追加されたみたいです。
- Session.ExecuteQuery - Provide support for parameters
現在、ExecuteQuery, ExecuteQueryWithMetaData, ExecuteNonQueryメソッドにて
パラメータクエリ用のオーバーロードが追加されています。ExecuteQueryWithMetaDataって何ぞやなのですが
これは次回取り上げようかなって思っています。
- Session.ExecuteQuery Method
- Session.ExecuteQueryWithMetadata Method
- Session.ExecuteNonQuery Method
どれも使い方は同じです。
以下、サンプル。
var dataStore = new InMemoryDataStore(); var dataLayer = new SimpleDataLayer(dataStore); using (var uow = new UnitOfWork(dataLayer)) { var sql = "SELECT Id, Name FROM BookGenre WHERE Name = @Name"; var pNames = new string[] { "Name" }; var pValues = new object[] { "Computer" }; var dbData = uow.ExecuteQuery(sql, pNames, pValues); var view = new XPDataView(); view.AddProperty("Id", typeof(int)); view.AddProperty("Name", typeof(string)); view.LoadData(dbData); grdMain.ItemsSource = view; }
ついでに、Gistにアップしておいた。
- [DevExpress][XPO] Session.ExecuteQuery() using a parameterized SQL query
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場