如果您不使用MS SQL Server,我認爲以下方法可行。
var sql = joinSqlBuilder.ToSql();
var data = this.Select<ProductWithManufacturer>(
q => q.Select(sql)
.Limit(skip,rows)
);
如果您正在使用MS SQL Server,它很可能會炸燬你。我正在努力將類似於此的更優雅的解決方案合併到JoinSqlBuilder中。以下是一個快速而骯髒的方法來完成你想要的。
我創建了以下擴展類:
public static class Extension
{
private static string ToSqlWithPaging<TResult, TTarget>(
this JoinSqlBuilder<TResult, TTarget> bldr,
string orderColumnName,
int limit,
int skip)
{
var sql = bldr.ToSql();
return string.Format(@"
SELECT * FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [{0}]) As RowNum, *
FROM (
{1}
)as InnerResult
)as RowConstrainedResult
WHERE RowNum > {2} AND RowNum <= {3}
", orderColumnName, sql, skip, skip + limit);
}
public static string ToSqlWithPaging<TResult, TTarget>(
this JoinSqlBuilder<TResult, TTarget> bldr,
Expression<Func<TResult, object>> orderSelector,
int limit,
int skip)
{
var member = orderSelector.Body as MemberExpression;
if (member == null)
throw new ArgumentException(
"TResult selector refers to a non member."
);
var propInfo = member.Member as PropertyInfo;
if (propInfo == null)
throw new ArgumentException(
"TResult selector refers to a field, it must be a property."
);
var orderSelectorName = propInfo.Name;
return ToSqlWithPaging(bldr, orderSelectorName, limit, skip);
}
}
它的應用如下所示:
List<Entity> GetAllEntities(int limit, int skip)
{
var bldr = GetJoinSqlBuilderFor<Entity>();
var sql = bldr.ToSqlWithPaging(
entity => entity.Id,
limit,
skip);
return this.Db.Select<Entity>(sql);
}
新的'Limit','Skip'和'Offset' API的[現已](HTTPS ://github.com/ServiceStack/ServiceStack.OrmLite/commit/f45700ef5c62edc28f61261549db1070189913eb)在JoinSqlBuilder中[v4.0.22現在在MyGet上](https://github.com/ServiceStack/ServiceStack/wiki/MyGet) – mythz
@mythz謝謝你,你真是太棒了! :) – wasatz
NP :)讓我知道在論壇中是否有任何問題。 – mythz