2013-05-09 5 views
5

Мне было интересно, имеет ли ORMLite решение QueryMultiple, такое как dapper.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

ли вы найти решение для этого? – 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 (работает в версии 3.9.55.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; 
    } 
} 

Тогда вы можете назвать как-то вроде этого:

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(); 

    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^