2013-05-09 6 views
5

मैं सोच रहा था कि ORMLite के पास क्वेरीर जैसे कई प्रश्न हैं।Servicestack ORMLite क्वेरी एकाधिक

मेरा उपयोग केस पेज किए गए परिणाम प्राप्त करने में है।

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

मैं भी कुछ अन्य मामलों में जहां मैं एक मुख्य प्रश्न के अतिरिक्त कुछ अन्य आँकड़े की गणना कर रहा हूँ, और मैं कई roundtrips से बचने के लिए उत्सुक हूँ।

(शायद असंबंधित, 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

यह वास्तव में इसके वर्तमान कार्यान्वयन में काम नहीं करेगा। 'कन्वर्ट टॉलिस्ट' ''रीडर) को आंतरिक रूप से उपयोग करने पर लागू होता है जो' NextResult()' को सुलभ होने से रोकने के लिए पाठक को रोकता है। –

3

आप कुछ सहायक ऑर्मिलाइट एक्सटेंशन (v 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(); 

    } 
} 
संबंधित मुद्दे