2017-02-24 92 views
4

我使用最新的ServiceStack OrmLite(目前v4.5.6)與C#如何在沒有LoadSelect的情況下返回asQueryable?

我需要從方法,如返回asQueryable;

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

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

     return asQueryable; 
    } 

但是,正如你所看到的,loadSelect已經去sql server了;
選擇PARAMSetc從表

所以我只需要IQueryable的沒有去到SQL Server。我是用Entity Framework做的,這裏是代碼;

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

是的,我正在寫一種通用倉庫包裝的,我知道倉庫模式不應該返回IQueryable的,因爲有人使用此方法,並可以使性能錯誤等這超出了我的話題現在。

如何使用OrmLite返回IQueryable?

回答

3

OrmLite使用它自己類型化的API進行查詢簡單查詢使用兩種simple lambda expressions

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

或者類型化SqlExpression<T>它提供了一個Typed API modeled closely over SQL也使用LINQ樣lambda表達式提供類型化的,豐富的API查詢RDBMS的,如:

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沒有實現IQueryable<T>,如果你需要一個SQL IQueryable<T>實現你需要使用IMPL的ORM像EF一樣激發它。

在任何其他ORM中獲取IQueryable<T>的唯一方法是將其從OrmLite返回的.NET List<T>返回,例如,克:

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

我看到一個這樣的帖子; here

首先沒有的IQueryable或LINQ在OrmLite它非常簡單,只是使用SQL或過濾器。 帶有「每個」的方法返回一個懶惰評估列表。

一般來說,你只需通過傳遞「其中SQL」查詢,「匿名類型」或 完整的SQL,例如:

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

對於查詢的建設的最新版本使用SqlBuilder類 這@samsaffron約舉行了會談: http://samsaffron.com/archive/2011/09/05/Digging+ourselves+out+of+the+mess+Linq-2-SQL+created

您可以返回代碼用於構造查詢,然後使用新的dbCmd查詢生成器輸出生成器類,例如:

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

微ORM的是並不適合每一個人,如果你有現有的代碼使用的IQueryable ,將它保持原樣可能會更好。

+1

FYI從2011年後過時了過時。 OrmLite擁有自己的SqlExpression和LINQ提供程序。 – mythz

相關問題