【问题标题】:Servicestack OrmLite "where exists" subqueryServicestack OrmLite“在哪里存在”子查询
【发布时间】:2014-09-22 01:37:29
【问题描述】:

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

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

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

但我收到以下错误

从范围“”引用的“[程序集].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 时,逻辑上不同的元素在构建查询时会被忽略,所以我现在得到了重复的客户端。

有没有其他方法,或者一般来说有没有办法处理 OrmLite 中的子查询? 任何帮助表示赞赏。

【问题讨论】:

  • 任何人对此有任何想法!

标签: subquery servicestack exists ormlite-servicestack


【解决方案1】:

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

如果您查看 4.0.x 文档,则没有关于子查询的讨论。最近增加了JOIN支持,但是对于高级SQL,需要write it yourself。

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

【讨论】:

  • 仅供参考,截至4.0.44,您可以在 Sql.In 子句中使用 SqlExpression。您可以将子查询重写为“在哪里 ClientId IN(从客户内部加入订单中选择客户 ID)”。但不能谈论性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2017-03-23
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
相关资源
最近更新 更多