2017-02-24 47 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

相关问题