如果没有 LoadSelect,我如何 return asQueryable?

How can I return asQueryable without LoadSelect?

我正在使用最新的 ServiceStack OrmLite(当前为 v4.5.6)和 C#

我需要 return asQueryable 来自一个方法,例如;

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

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

        return asQueryable;
    }

但是如您所见,加载Select 已经转到 sql 服务器,例如;
Select 来自 Table

的 PARAMSetc

所以我只需要 IQueryable 而无需转到 sql 服务器。我是用 Entity Framework 做的,这是代码;

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

是的,我正在编写一种通用存储库包装器,我知道存储库模式不应该 return IQueryable,因为有人使用此方法可能会导致性能错误等。这不在我的主题范围内,对吧现在。

我如何 return IQueryable with OrmLite?

I saw a post like this; here

首先,OrmLite 中没有 IQueryable 或 Linq,它几乎只使用 SQL 或过滤器。 "Each" 中的方法 return 返回延迟计算的列表。

Generally you just query by passing in a "where sql", "anon types" or full sql, eg:

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

For building of queries the latest version uses a SqlBuilder class which @samsaffron talks about here: http://samsaffron.com/archive/2011/09/05/Digging+ourselves+out+of+the+mess+Linq-2-SQL+created

您可以 return 其他代码用来构建查询的构建器 class,然后在新的 dbCmd 查询中使用构建器输出,示例:

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

Micro ORM 并不适合所有人,如果您有使用 IQueryable 的现有代码,最好保持原样。

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> 实现,您需要使用像 EF 一样实现它的 ORM。

在任何其他 ORM 中获得 IQueryable<T> 的唯一方法是 return 它从 .NET List<T> 转换为 OrmLite return,例如:

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