Servicestack OrmLite“where exists”子查询

时间:2014-07-30 12:03:51

标签: subquery servicestack exists ormlite-servicestack

无论我怎么努力,我都无法使它工作,我不确定它是否可行。 我想选择至少有一个订单的所有客户。

我尝试的第一件事是db.Exists如下:

SqlExpression<Client> exp = OrmLiteConfig.DialectProvider.SqlExpression<Client>(); exp.Where(x => Db.Exists<Order>(z => z.ClientId == x.Id));

但是我收到以下错误

  

类型'[assembly] .Client'的变量'x',从范围''引用,但它未定义。

第二次尝试使用Join和SelectDistinct:

SqlExpression<Client> exp = OrmLiteConfig.DialectProvider.SqlExpression<Client>(); ev.Join<Client, Order>((b, a) => b.Id == a.ClientId) .SelectDistinct(x => new { x.Id, x.ClientNumber, x.ClientNameName});

虽然不是最佳的,但直到我需要通过

分页结果集时

ev.Limit(skip:((request.Page-1) * request.PageSize), rows:request.PageSize)

使用Limit时,在构建查询时逻辑上会忽略distinct,因此我现在得到重复的客户端。

还有其他方法,或者通常是在那里处理OrmLite中的子查询? 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

ServiceStack OrmLite(目前为4.0.x)不支持子查询。

如果查看4.0.x文档,则不会讨论子查询。最近添加了JOIN支持,但对于高级SQL,您需要write it yourself

老实说,在复杂的某个点上,SQL比高级ORM / LINQ样式查询更具可读性。