2013-05-09 39 views
5

Tôi đã tự hỏi liệu ORMLite có một giải pháp QueryMultiple như dapper hay không.Truy vấn ORMLite Servicestack Nhiều

Trường hợp sử dụng của tôi là nhận kết quả được phân trang.

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")) 
}; 

Tôi cũng có một vài trường hợp khác khi tôi tính toán một số thống kê khác ngoài truy vấn chính và tôi muốn tránh nhiều vòng lặp.

(Có lẽ không liên quan, nhưng tôi đang sử dụng PostgreSQL)

+0

Bạn tìm một giải pháp cho việc này? – kaptan

Trả lời

4

Bạn có lẽ có thể làm điều gì đó như thế này:

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; 

}); 

Nó có thể là có thể quấn này trong một phương pháp mở rộng, nhưng không thông minh đang đến với tâm trí.

+1

Điều này thực sự sẽ không hoạt động trong triển khai hiện tại của nó. 'ConvertToList' áp dụng một' sử dụng (reader) 'nội bộ mà đóng người đọc khi vứt bỏ, ngăn chặn' NextResult() 'từ được truy cập. –

3

Bạn có thể tạo một số trợ giúp Phần mở rộng OrmLite (hoạt động trong v 3.9.55.0) khá dễ dàng để KHÔNG bao bọc trình đọc. Nó là khá dễ dàng vì các phương pháp bạn cần là công khai. Đây là cách tôi đã làm nó.

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; 
    } 
} 

Sau đó, bạn có thể gọi như một cái gì đó như thế này:

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

    } 
}