2013-05-09 16 views
5

ORMLiteがdapperのようなQueryMultipleソリューションを持っているのだろうかと思っていました。Servicestack ORMLite Query Multiple

私の使用例はページングされた結果を得ることです。

return new { 
    Posts = conn.Select<Post>(q => q.Where(p => p.Tag == "Chris").Limit(20, 10)) 
    TotalPosts = conn.Count<Post>(q.Where(p => p.Tag == "Chris")) 
}; 

また、私はメインクエリに加えて、他のいくつかの統計情報を計算しています、と私は多重周回を避けるために熱心だ他のいくつかの例があります。

(おそらく無関係な、しかし、私が使用しているPostgreSQLの)

+0

あなたは、このための解決策を見つけるか:

public static class MultiResultReaderOrmLiteExtensions { public static IList CustomConvertToList<T>(this IDataReader dataReader) { var modelDef = ModelDefinition<T>.Definition; var type = typeof (T); var fieldDefs = modelDef.AllFieldDefinitionsArray; var listInstance = typeof(List<>).MakeGenericType(type).CreateInstance(); var to = (IList)listInstance; var indexCache = dataReader.GetIndexFieldsCache(modelDef); while (dataReader.Read()) { var row = type.CreateInstance(); row.PopulateWithSqlReader(dataReader, fieldDefs, indexCache); to.Add(row); } return to; } public static Dictionary<string, int> GetIndexFieldsCache(this IDataReader reader, ModelDefinition modelDefinition = null) { var cache = new Dictionary<string, int>(); if (modelDefinition != null) { foreach (var field in modelDefinition.IgnoredFieldDefinitions) { cache[field.FieldName] = -1; } } for (var i = 0; i < reader.FieldCount; i++) { cache[reader.GetName(i)] = i; } return cache; } } 

次に、あなたがこのような何かのように呼び出すことができますか? – kaptan

答えて

4

あなたは、おそらくこのような何かを行うことができます。

var bothThings = db.Exec(cmd => { 

    cmd.CommandText = @" 
     select * from TableA 
     select * from TableB"; 

    var both = new BothAandB(); 

    using (var reader = cmd.ExecuteReader()) 
    { 
     both.a = reader.ConvertToList<A>(); 
     reader.NextResult(); 
     both.b = reader.ConvertToList<B>(); 
    } 

    return both; 

}); 

拡張メソッドでこれをラップすることが可能になり、何も賢いかもしれません心に来ている。

+1

これは実際には現在の実装では機能しません。 'ConvertToList'は、' using(reader) 'を内部的に適用して、' NextResult() 'にアクセスできないようにします。 –

3

いくつかのヘルパーOrmLite拡張機能(v 3.9.55.0で動作)を非常に簡単に作成することができます。これは、読者を包むことはありません。必要な方法が公開されているので、簡単です。ここで私はそれをやった方法です。

using (var db = _connectionFactory.OpenDbConnection()) 
{ 
    var cmd = db.api_GetSprocWithMultResults(id); 
    using (IDataReader reader = cmd.DbCommand.ExecuteReader()) 
    { 
     meta = reader.CustomConvertToList<Element_Media_Meta>().Cast<Element_Media_Meta>().ToList(); 
     reader.NextResult(); 
     queues = reader.CustomConvertToList<Element_Media_ProcessQueue>().Cast<Element_Media_ProcessQueue>().ToList(); 

    } 
}