首页 > 解决方案 > 如果给定谓词为空,是否可以跳过过滤器?

问题描述

我目前正在尝试在我的存储库中实现一些过滤器。我问自己的问题是是否可以跳过一些过滤器,例如orderBy()给定queryHolder.order为空的过滤器。

目前,我只是在做一个空检查并复制其余的。但这看起来很丑陋,也不是很方便。

当前方法

suspend fun testQuery(queryHolder: QueryHolder): QuerySnapshot = if (queryHolder.order != null) {
        db.collection(FIREBASE_PRODUCTS_BASE_PATH)
            .limit(SHOP_DB_DOCUMENT_LIMIT)
            .whereEqualTo(FIREBASE_PRODUCT_CATEGORY, queryHolder.category)
            .orderBy(queryHolder.order, queryHolder.orderAscending!!) <-- Would like to skip this, if null
            .get()
            .await()
    } else {
        db.collection(FIREBASE_PRODUCTS_BASE_PATH)
            .limit(SHOP_DB_DOCUMENT_LIMIT)
            .whereEqualTo(FIREBASE_PRODUCT_CATEGORY, queryHolder.category)
            .get()
            .await()
    }

这种方法的另一个问题是,它并不涵盖所有情况,例如,我希望我queryHolder.category也可以为空,以便我获得整个云火库列表

标签: androidkotlinfiltergoogle-cloud-firestore

解决方案


您可以在调用apply{ }之前有条件地影响查询的构建:get()

        db.collection(FIREBASE_PRODUCTS_BASE_PATH)
            .limit(SHOP_DB_DOCUMENT_LIMIT)
            .whereEqualTo(FIREBASE_PRODUCT_CATEGORY, queryHolder.category)
            .apply{
               if(queryHolder.order != null){
                 orderBy(queryHolder.order, queryHolder.orderAscending!!)
               }
            }.get().await()
   

推荐阅读