2017-02-24 4 views
4

Ich benutze die neueste ServiceStack OrmLite (derzeit v4.5.6) mit C#Wie kann ich asQueryable ohne LoadSelect zurückgeben?

Ich muss asQueryable von einer Methode wie z.

using (IDbConnection databaseConnection = _databaseFactory.Open()) 
    { 
     SqlExpression<T> sqlExpression = databaseConnection.From<T>(); 

     IQueryable<T> asQueryable = databaseConnection.LoadSelect(sqlExpression, include) 
                 .AsQueryable(); 

     return asQueryable; 
    } 

Aber wie Sie sehen können, loadSelect bereits auf SQL-Server gehen wie;
Wählen Sie PARAMSetc FROM Tabelle

Also ich brauche nur IQueryable ohne auf SQL-Server gehen. Ich habe es mit Entity Framework gemacht, hier ist der Code;

public IQueryable<T> GetAll(Expression<Func<T, bool>> predicate) 
{ 
    return _dbSet.Where(predicate); 
} 

Und ja, ich bin eine Art generischen Repository-Wrapper zu schreiben und ich weiß, Repository-Muster soll nicht IQueryable zurückgeben, weil jemand diese Methode verwenden, und konnte die Leistung Fehler usw. macht diese jetzt aus meinem Thema.

Wie kann ich IQreryable mit Ormlite zurückgeben?

Antwort

3

OrmLite verwendet er eigene typisierte API ist mit für die Abfrage entweder simple lambda expressions für einfache Abfragen:

var results = db.Select<Poco>(x => x.Id == 1); 

Oder ein typisierten SqlExpression<T>, die eine Typed API modeled closely over SQL liefert, die auch LINQ wie Lambda-Ausdrücke verwendet eine typisierte bereitzustellen, reichen API für RDBMS abfragt, zB:

var q = db.From<Track>() 
    .Where(x => customYears.Contains(x.Year)) 
    .And(x => x.Name.Contains("A")) 
    .GroupBy(x => x.Year) 
    .OrderByDescending("Total") 
    .ThenBy(x => x.Year) 
    .Take(2); 

var results = db.Select(q); 

OrmLite nicht IQueryable<T> implementieren, wenn Sie eine SQL-IQueryable<T> Implementierung benötigen Sie benötigen ein ORM zu verwenden, die impl wie EF.

Die einzige Möglichkeit, ein IQueryable<T> in einem anderen ORM zu erhalten, ist, es von einem .NET List<T>, das OrmLite zurückgibt, e.g:

List<Poco> results = db.Select<Poco>(); 
IQueryable<Poco> queryable = results.AsQueryable(); 
1

Ich sah einen Beitrag wie diesen; here

Zum einen gibt es keine IQueryable oder Linq in OrmLite ist es ziemlich einfach SQL oder Filter verwenden. Methoden mit "Each" in ihnen geben eine träge ausgewertete Liste zurück.

allgemeine Abfrage, die Sie gerade indem sie in einem "auf dem SQL", "Anon-Typen" oder vollständigen SQL, zB vorbei:

var results = dbCmd.Select<Poco>("Name = {0}", name); 
var results = dbCmd.Where<Poco>("Name", name); 
var results = dbCmd.Where<Poco>(new { Name = name }); 
var results = dbCmd.Select<Poco>("Select * from Poco Where Name = {0}", name); 
var results = dbCmd.Query<Poco>("Select * from Poco Where Name = @name", new { name }); 

Für den Bau von Abfragen die neueste Version verwendet eine SqlBuilder Klasse , die Gespräche über hier @samsaffron: http://samsaffron.com/archive/2011/09/05/Digging+ourselves+out+of+the+mess+Linq-2-SQL+created

Sie können eine Builder-Klasse zurück, die andere Code verwendet die Abfrage zu erstellen und dann die Baumeister Ausgabe verwendet in einer neuen dbCmd Abfrage Beispiel:

var count = dbCmd.QuerySingle<Poco>(count.RawSql, count.Parameters); 
var rows = dbCmd.Query<Poco>(selector.RawSql, selector.Parameters); 

Micro ORM sind nicht jedermanns Sache, und wenn Sie Code haben vorhandenes using IQueryable Es könnte besser sein, es so zu lassen, wie es ist.

+1

FYI dieser Beitrag von 2011 ist bedauerlicherweise veraltet. Ormlite hat einen eigenen SqlExpression- und LINQ-Provider. – mythz

Verwandte Themen