我试图在我的ServiceStack(4.0.50)服务中完成分页,并且当使用{{1} 查询有多个联接时,我遇到了问题}。
为了过滤安全要求的结果,我的LoadSelect
方法从自定义用户会话中提取信息并构建查询。像这样:
Get
计数始终正常,结果的第一页始终有效。但是,拉取后续结果页面会出现以下错误:当子查询未与EXISTS一起引入时,只能在选择列表中指定一个表达式。
不幸的是,我需要应用过滤,这需要连接。不幸的是我需要加载引用并希望避免选择n + 1情况。我已经尝试检查public QueryResponse<Foo> Get(Foos request)
{
var session = SessionAs<CustomUserSession>();
var q = Db.From<Foo>().LeftJoin<Foo, User>((s, u) => s.UserId == u.Id);
// Also tried this with no success
//q.Skip(request.Skip);
//q.Take(request.Take);
q.Limit(request.Skip, request.Take);
// I do filtering based on the request object for searching
if (request.Price.HasValue)
{
q.And(s => s.Price == request.Price);
}
// ... and so on ...
// Then I do filtering based on roles
if (session.HasRole("OrgAdmin"))
{
// Do some filtering for their organization
}
else if (session.HasRole("SiteManager"))
{
// More filtering here
}
// Ordering also...
if (request.OrderBy.IsNullOrEmpty())
{
q.OrderByFieldsDescending(request.OrderByDesc);
}
else
{
q.OrderByFields(request.OrderBy);
}
var response = new QueryResponse<Foo>
{
// This works fine
Total = (int)Db.Count(q),
// === Error here ===
Results = Db.LoadSelect(q)
};
return response;
}
对象中的SQL表达式,但它看起来没有任何方式可以看到发送到的最终SQL是什么服务器。
有什么建议吗?
注意:我没有使用AutoQuery,我只是挪用了q
和QueryBase<>
个对象来使用分页和计数属性。
答案 0 :(得分:2)
事实证明这是标准SqlServerDialect.Provider
的问题。由于这是SQL 2012,当我在AppHost中切换到SqlServer2012Dialect.Provider
时,它按预期工作。