2016-04-19 13 views
2

NSPredicateにSUBQUERYを書き込もうとしています。私の問題は、私はSUBQUERYの述語部分のために手元にあるクエリを持っていないということです。 SUBQUERYの中にNSPredicateをネストする方法はありますか?サブスクライバ内のNSPredicate

は、例えば、これは私が試したものです:

let ordersPredicate = NSPredicate()//some predicate passed in 
//how do I use the ordersPredicate inside the subquery?? 
let subQueryPredicate = NSPredicate(format: "SUBQUERY(orders, $x,'%@')[email protected] > 0", ordersPredicate.predicateFormat) 

アップデート:私は最初の述語を実行し、クエリのいずれかの実行して、今の汚い回避策をしなければなりませんでした。そのラメ:(私も後でパイプラインの他の場所ordersPredicateを実行していますので..私は解決策を考え出すことができました@Willekeからいくつかのポインタへ

let fetchRequest = NSFetchRequest()//blah 
fetchRequest.predicate = orderPredicate 
let orders = //execute fetch 
let subQueryPredicate = NSPredicate(format: "SUBQUERY(orders, $x, ANY $x in %@)[email protected] > 0", orders) 
+0

はあなたのOrderクラス/定義を投稿し、あなたが達成したいのか説明できる? – vikingosegundo

+0

あなたはサブクエリを必要としないこの問題を回避するには、 'ANY注文を%を@に'行いますです。 Wあなたは 'returnObjectsAsFaults'をfalseに設定していますか? – Willeke

+0

サブクエリで述語を使用したい場合、述語は '$ x.orderNumber = 10'のようなもので' $ x'とする必要があります。述部を変換することは可能ですが、パイプラインを再設計する方が簡単かもしれません。 – Willeke

答えて

2

感謝。

public extension NSPredicate{ 
    public func stringForSubQuery(prefix:String) -> String{ 
     var predicateString = "" 
     if let predicate = self as? NSCompoundPredicate{ 
      for (index, subPredicate) in predicate.subpredicates.enumerate(){ 

       if let subPredicate = subPredicate as? NSComparisonPredicate{ 
        predicateString = "\(predicateString) \(prefix)\(subPredicate.predicateFormat)" 
       } 
       else if let subPredicate = subPredicate as? NSCompoundPredicate{ 
        predicateString = "\(predicateString) (\(subPredicate.stringForSubQuery(prefix)))" 
       } 
       //if its not the last predicate then append the operator string 
       if index < predicate.subpredicates.count - 1 { 
        predicateString = "\(predicateString) \(getPredicateOperatorString(predicate.compoundPredicateType))" 
       } 
      } 
     } 
     return predicateString 
    } 
    private func getPredicateOperatorString(predicateType: NSCompoundPredicateType) -> String{ 
     switch(predicateType){ 
     case .NotPredicateType: return "!" 
     case .AndPredicateType: return "&&" 
     case .OrPredicateType: return "||" 
     } 
    } 
} 

そしてここでは、使用

let ordersPredicate = NSPredicate()//some predicate passed in 
let ordersPredicateFormat = orderPredicate.stringForSubQuery("$x.") 
let subQueryPredicate = NSPredicate(format: "SUBQUERY(orders, $x, \(ordersPredicateFormat))[email protected] > 0")