Ejemplo n.º 1
0
        /// <summary>
        /// build specification from rsql query
        /// </summary>
        /// <param name="queryCollection"></param>
        /// <returns></returns>
        private Expression <Func <T, bool> > Build(IQueryCollection queryCollection)
        {
            var result = QueryExpressionHelper.True <T>();

            if (queryCollection.TryGetValue(_autumnSettings.QueryField, out var query))
            {
                result = GetOrRegistryQuery(query, _autumnSettings);
            }
            return(result);
        }
Ejemplo n.º 2
0
 private static Expression <Func <T, bool> > GetOrRegistryQuery(string query, AutumnSettings autumnSettings)
 {
     lock (QueryExpressionHelper.QueriesCache)
     {
         if (string.IsNullOrWhiteSpace(query))
         {
             return(QueryExpressionHelper.True <T>());
         }
         var hash = Hash($"{typeof(T).FullName}?{query}");
         if (QueryExpressionHelper.QueriesCache.TryGetValue(hash, out Expression <Func <T, bool> > result))
         {
             return(result);
         }
         var antlrInputStream  = new AntlrInputStream(query);
         var lexer             = new QueryLexer(antlrInputStream);
         var commonTokenStream = new CommonTokenStream(lexer);
         var parser            = new QueryParser(commonTokenStream);
         var eval    = parser.or();
         var visitor = new DefaultQueryVisitor <T>(autumnSettings.NamingStrategy);
         result = visitor.VisitOr(eval);
         QueryExpressionHelper.QueriesCache.Set(hash, result);
         return(result);
     }
 }