iBatis.NETには、Java版と同じくIDictionary(javaでいうMap)で結果を取得できる機能があります。
使用するメソッドは、QueryForDictionaryとなります。このメソッドもQueryForListと同じくジェネリック対応
となっています。
QueryForDictionaryメソッドには、2つのパターンがあります。
QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty)
の方は、結果データの中からkeyPropertyで指定したカラムの値をDictionaryのキーとし、valuePropertyで指定したカラムの値
をDictionaryの値として返してきます。
例えば以下のように使います。
QueryForDictionary("Author.FindAuthors", null, "Id", "Name")
上記の場合だと、Author.FindAuthorsクエリの結果列の内、IdをキーとしてNameを値としたDictionaryが帰ってきます。
もう一つのパターンは、以下のものです。
QueryForDictionary(string statementName, object parameterObject, string keyProperty)
このパターンでは、keyPropertyのみを指定します。帰ってくるDictionaryは、クエリの結果をいつも通りマッピングした結果の
データオブジェクトとなります。以下のようにして使用します。
QueryForDictionary("Author.FindAuthors", null, "Id")
上記の場合だと、Author.FindAuthorsクエリの結果列の内、Idをキーとしてクエリのマッピング結果を値としたDictionaryが帰ってきます。
注意点として、このパターンのメソッドを使用する場合は、必ずSQL定義ファイルにてresultMapの設定が必要になります。
てことで、以下サンプルです。
[Author.cs]
using System; using System.Collections.Generic; namespace Gsf.Samples.IBatisNet.Models { public class Author { int _id; string _name; int _age; public int Id{ get{ return _id; } set{ _id = value; } } public string Name{ get{ return _name; } set{ _name = value; } } public int Age{ get{ return _age; } set{ _age = value; } } public override string ToString() { return string.Format("id:{0}, name:{1}, age:{2}", Id, Name, Age); } } }
<?xml version="1.0" encoding="utf-8" ?> <sqlMap namespace="Author" xmlns="http://ibatis.apache.org/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <alias> <typeAlias type="Gsf.Samples.IBatisNet.Models.Author" alias="Author"/> </alias> <resultMaps> <!-- 結果をIDictionary<K, V>で返却するには、必ずresultMapが必要となる。 (resultMapを定義しないと、エラーとなる。) resultMapでマッピングするのは、マップの値となるオブジェクトの分を設定する。 キーの分については、自動的にマッピングが行われる。 --> <resultMap id="find-authors-result" class="Author"> <result column="Id" property="Id"/> <result column="Name" property="Name"/> <result column="Age" property="Age"/> </resultMap> </resultMaps> <statements> <select id="FindAuthors" resultMap="find-authors-result"> <![CDATA[ select a.AuthorId as Id ,a.Name as Name ,a.Age as Age from Authors a ]]> </select> </statements> </sqlMap>
[テストユニット]
using System; using System.Collections.Generic; using Gsf.Samples.IBatisNet.Models; using IBatisNet.Common; using IBatisNet.DataMapper; using NUnit.Framework; namespace Gsf.Samples.IBatisNet { [TestFixture] public class IBatisSample009 { [Test] public void IDictionaryで結果を取得(){ // // キーにAuthorId, 値としてNameをマッピングしてIDictionaryを取得する場合 // IDictionaryauthorNamesMap = Mapper.Instance().QueryForDictionary ("Author.FindAuthors", null, "Id", "Name"); foreach(KeyValuePair pair in authorNamesMap) { Console.WriteLine("key:{0}, value:{1}", pair.Key, pair.Value); } // // キーにAuthorId, 値としてAuthorオブジェクトをマッピングしてIDictionaryを取得する場合 // IDictionary authorsMap = Mapper.Instance().QueryForDictionary ("Author.FindAuthors", null, "Id"); Assert.IsNotNull(authorsMap); Assert.AreNotEqual(0, authorsMap); foreach(KeyValuePair pair in authorsMap){ Console.WriteLine("key:{0}, value:{1}", pair.Key, pair.Value); } } } class DummyEntryPoint009{ static void Main(){ // // nop; // } } }
上記を実行すると、例えば以下のように出力されます。
key:1, value:gsf_zero1 key:2, value:gsf_zero2 key:3, value:gsf_zero3 key:1, value:id:1, name:gsf_zero1, age:28 key:2, value:id:2, name:gsf_zero2, age:29 key:3, value:id:3, name:gsf_zero3, age:30