联合 ServiceStack ORM lite 4.5.4 中的所有支持

Union all support in ServiceStack ORM lite 4.5.4

在我的应用程序中,用户可以为特定类型定义多个过滤器。我想以某种方式将这些查询合并为一个。

SqlExpression<Notice> query1 = Db.From<Notice>(s=>s.param1 == 2);
// ...queries are more complicated but result type is same
SqlExpression<Notice> query2 = Db.From<Notice>(s=>s.param1 == 3 && s.param2 == 3);

SqlExpression<Notice> unionAll = query1.UnionAll(query2);
var result = Db.Select(unionAll);

知道如何在 Orm Lite (4.5.4) 中实现吗?

我不确定向 ServiceStack 添加 UnionAll 方法是否会给您带来很多好处,因为这两个查询无论如何都会单独调用。我想您可以创建一个易于使用的扩展方法。

无论如何,您可以分别调用每个结果,然后使用 AddRange 方法将第二个结果附加到第一个结果。

var results = Db.Select(query1); var results2 = Db.Select(query2); results.AddRange(results2);

替代AddRange,如果您需要排除重复项,您可以使用Union method. And if you want to create a new list and not mutate query1's results, you can use the Concat方法。这两个选项是 System.Linq IEnumerable 上的扩展方法。

虽然没有官方 API 允许您这样做,但您应该能够使用类似以下内容的方式构建它:

var sql = query1.ToSelectStatement()
          + " UNION ALL " +
          query2.ToSelectStatement();

var results = db.SqlList<Notice>(sql);