public static FilterDefinition <T> ToMongodbFilter(QueryModel3 queryModel)
        {
            if (queryModel.QueryUnits != null && queryModel.QueryUnits.Any())
            {
                List <FilterDefinition <T> > unitFilters = new List <FilterDefinition <T> >();
                foreach (var unitItem in queryModel.QueryUnits)
                {
                    var unitFilter = MongodbHelper.HandleQueryUnitModel <T>(unitItem);
                    if (unitFilter != null)
                    {
                        unitFilters.Add(unitFilter);
                    }
                }

                return(MongodbHelper.HandleFilterDefinitions(unitFilters, queryModel.LogicalOperator));
            }
            else
            {
                var filter = Builders <T> .Filter.Empty;
                if (queryModel.QueryModels == null || !queryModel.QueryModels.Any())
                {
                    return(filter);
                }

                List <FilterDefinition <T> > queryModelFilters = new List <FilterDefinition <T> >();
                foreach (var queryModel2Item in queryModel.QueryModels)
                {
                    queryModelFilters.Add(ToMongodbFilter(queryModel2Item));
                }

                return(MongodbHelper.HandleFilterDefinitions(queryModelFilters, queryModel.LogicalOperator));
            }
        }
        public static string Test4()
        {
            // { "$and" : [{ "FormId" : "CarInfo" }, { "Level1" : "Apple" }, { "CreateDate" : { "$gte" : "2010-01-01", "$lte" : "2020-12-31" } }, { "FormValues" : { "$elemMatch" : { "key" : "key1", "value" : { "$ne" : "", "$lte" : "2020" } } } }, { "FormValues" : { "$elemMatch" : { "key" : "key2", "value" : { "$gte" : "2000", "$lte" : "2020" } } } }] }
            QueryModel3 queryModel = new QueryModel3()
            {
                QueryUnits = new List <QueryUnit>()
                {
                    new QueryUnit()
                    {
                        Factors = new List <QueryFactor>()
                        {
                            new QueryFactor()
                            {
                                Key            = "FormId",
                                ValueOperators = new List <QueryFactorOperator>()
                                {
                                    new QueryFactorOperator()
                                    {
                                        Value = "CarInfo"
                                    }
                                }
                            },
                            new QueryFactor()
                            {
                                Key            = "Level1",
                                ValueOperators = new List <QueryFactorOperator>()
                                {
                                    new QueryFactorOperator()
                                    {
                                        Value = "Apple"
                                    }
                                }
                            },
                            new QueryFactor()
                            {
                                Key            = "CreateDate",
                                ValueOperators = new List <QueryFactorOperator>()
                                {
                                    new QueryFactorOperator()
                                    {
                                        Value = "2010-01-01", QueryOperator = QueryOperatorKind.GTE
                                    },
                                    new QueryFactorOperator()
                                    {
                                        Value = "2020-12-31", QueryOperator = QueryOperatorKind.LTE
                                    }
                                }
                            }
                        }
                    },
                    new QueryUnit()
                    {
                        ElemMatchName = "FormValues",
                        Factors       = new List <QueryFactor>()
                        {
                            new QueryFactor()
                            {
                                Key            = "key",
                                ValueOperators = new List <QueryFactorOperator>()
                                {
                                    new QueryFactorOperator()
                                    {
                                        Value = "key1"
                                    }
                                }
                            },
                            new QueryFactor()
                            {
                                Key            = "value",
                                ValueOperators = new List <QueryFactorOperator>()
                                {
                                    new QueryFactorOperator()
                                    {
                                        Value = "", QueryOperator = QueryOperatorKind.NE
                                    },
                                    new QueryFactorOperator()
                                    {
                                        Value = "2020", QueryOperator = QueryOperatorKind.LTE
                                    }
                                }
                            }
                        }
                    },
                    new QueryUnit()
                    {
                        ElemMatchName = "FormValues",
                        Factors       = new List <QueryFactor>()
                        {
                            new QueryFactor()
                            {
                                Key            = "key",
                                ValueOperators = new List <QueryFactorOperator>()
                                {
                                    new QueryFactorOperator()
                                    {
                                        Value = "key2"
                                    }
                                }
                            },
                            new QueryFactor()
                            {
                                Key            = "value",
                                ValueOperators = new List <QueryFactorOperator>()
                                {
                                    new QueryFactorOperator()
                                    {
                                        Value = "2000", QueryOperator = QueryOperatorKind.GTE
                                    },
                                    new QueryFactorOperator()
                                    {
                                        Value = "2020", QueryOperator = QueryOperatorKind.LTE
                                    }
                                }
                            }
                        }
                    }
                }
            };
            var filter = QueryModel3Helper <BsonDocument> .ToMongodbFilter(queryModel);

            return(MongodbHelper.FilterDefinitionToJsonString(filter));
        }
        public static string Test3()
        {
            //1&2&3|(1&(4|5))
            QueryModel3 queryModel = new QueryModel3()
            {
                LogicalOperator = LogicalOperatorKind.Or,
                QueryModels     = new List <QueryModel3>()
                {
                    new QueryModel3()
                    {
                        QueryUnits = new List <QueryUnit>()
                        {
                            new QueryUnit()
                            {
                                Factors = new List <QueryFactor>()
                                {
                                    new QueryFactor()
                                    {
                                        Key            = "col_1",
                                        ValueOperators = new List <QueryFactorOperator>()
                                        {
                                            new QueryFactorOperator()
                                            {
                                                Value = "col_1_value"
                                            }
                                        }
                                    },
                                    new QueryFactor()
                                    {
                                        Key            = "col_2",
                                        ValueOperators = new List <QueryFactorOperator>()
                                        {
                                            new QueryFactorOperator()
                                            {
                                                Value = "col_2_value"
                                            }
                                        }
                                    },
                                    new QueryFactor()
                                    {
                                        Key            = "col_3",
                                        ValueOperators = new List <QueryFactorOperator>()
                                        {
                                            new QueryFactorOperator()
                                            {
                                                Value = "col_3_value"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    new QueryModel3()
                    {
                        QueryModels = new List <QueryModel3>()
                        {
                            new QueryModel3()
                            {
                                QueryUnits = new List <QueryUnit>()
                                {
                                    new QueryUnit()
                                    {
                                        Factors = new List <QueryFactor>()
                                        {
                                            new QueryFactor()
                                            {
                                                Key            = "col_1",
                                                ValueOperators = new List <QueryFactorOperator>()
                                                {
                                                    new QueryFactorOperator()
                                                    {
                                                        Value = "col_1_value"
                                                    }
                                                }
                                            },
                                        }
                                    }
                                }
                            },
                            new QueryModel3()
                            {
                                QueryUnits = new List <QueryUnit>()
                                {
                                    new QueryUnit()
                                    {
                                        LogicalOperator = LogicalOperatorKind.Or,
                                        Factors         = new List <QueryFactor>()
                                        {
                                            new QueryFactor()
                                            {
                                                Key            = "col_4",
                                                ValueOperators = new List <QueryFactorOperator>()
                                                {
                                                    new QueryFactorOperator()
                                                    {
                                                        Value = "col_4_value"
                                                    }
                                                }
                                            },
                                            new QueryFactor()
                                            {
                                                Key            = "col_5",
                                                ValueOperators = new List <QueryFactorOperator>()
                                                {
                                                    new QueryFactorOperator()
                                                    {
                                                        Value = "col_5_value"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            };
            var filter = QueryModel3Helper <BsonDocument> .ToMongodbFilter(queryModel);

            return(MongodbHelper.FilterDefinitionToJsonString(filter));
        }