2016-04-19 3 views
2

Я пытаюсь написать SUBQUERY для NSPredicate. Моя проблема заключается в том, что у меня нет запроса на предикатную часть SUBQUERY. Есть ли способ вложить NSPredicate внутри SUBQUERY?NSPredicate Внутри SUBQUERY

Например, это то, что я пробовал:

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) 

Обновление: Я должен был сделать грязную обходной путь сейчас, выполнив первый предикат и делает ANY В запросе. Его хромой :(потому что я выполнения ordersPredicate в другом месте, а позже в трубопроводе ..

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

в обходном пути вам не нужен подзапрос, 'любые заказы в% @' будут делать. W Вы устанавливаете 'returnObjectsAsFaults' значение false? – Willeke

+0

Если вы хотите использовать предикат в подзапросе, предикат должен быть чем-то вроде '$ x.orderNumber = 10', с' $ x'. Можно преобразовать предикат, но может быть проще перепроектировать конвейер. – Willeke

ответ

2

Благодаря некоторым из указателей @Willeke я смог придумать решение.

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") 

 Смежные вопросы

  • Нет связанных вопросов^_^