2017-01-11 4 views
1

私のアプリケーションでは、特定のタイプに対して複数のフィルタを定義できます。私はどうにかしてこれらのクエリを単一のものに組み合わせたいと思っています。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)でどのように実装すればよいでしょうか?

答えて

0

あなたがこれを行うことができます公式APIはありません一方で、あなたのようなものでそれを構築することができるはずです。

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

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

ServiceStackにUnionAllメソッドを追加しても、両方のクエリが別々に呼び出されるため、購入する可能性が高いとは思えません。私はあなたが使いやすい拡張メソッドを作成することができたと思います。

いずれにしても、それぞれを別々に呼び出してから、AddRangeメソッドを使用して2番目の結果を1番目に追加することができます。 AddRangeへ

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

代替あなたは、重複を排除するために必要がある場合、あなたはUnionメソッドを使用することができます。また、新しいリストを作成し、query1の結果を変更しない場合は、Concatメソッドを使用できます。これらの2つのオプションは、IEnumerableのSystem.Linq拡張メソッドです。

関連する問題