public void Delete <T>(Expression <Func <T, bool> > query, bool softCommit = false)
        {
            if (query == null)
            {
                throw new ArgumentNullException(nameof(query));
            }

            var translator = new LinqToSolrQueryTranslator(this, typeof(T));
            var q          = Evaluator.PartialEval(query);
            var queryToStr = translator.Translate(BooleanVisitor.Process(q));

            PerformDelete <T>(queryToStr, softCommit);
        }
Beispiel #2
0
        internal ILinqToSolrService GetSolrQuery(Expression expression)
        {
            var elementType = TypeSystem.GetElementType(expression.Type);

            Service.ElementType = elementType;
            var qt = new LinqToSolrQueryTranslator(Service);

#if PORTABLE || NETCORE
            expression = Evaluator.PartialEval(expression, e => e.NodeType != ExpressionType.Parameter && !typeof(IQueryable).GetTypeInfo().IsAssignableFrom(e.Type.GetTypeInfo()));
#else
            expression = Evaluator.PartialEval(expression, e => e.NodeType != ExpressionType.Parameter && !typeof(IQueryable).IsAssignableFrom(e.Type));
#endif

            Service.CurrentQuery           = Service.CurrentQuery ?? new LinqToSolrQuery();
            Service.CurrentQuery.FilterUrl = qt.Translate(BooleanVisitor.Process(expression));


            return(Service);
        }
        protected override Expression VisitMethodCall(MethodCallExpression m)
        {
            if (m.Method.Name == "Where" || m.Method.Name == "First" || m.Method.Name == "FirstOrDefault")
            {
                var lambda = (LambdaExpression)StripQuotes(m.Arguments[1]);

                var solrQueryTranslator = new LinqToSolrQueryTranslator(_service);
                var fq = solrQueryTranslator.Translate(lambda.Body);
                sb.AppendFormat("&fq={0}", fq);

                var arr = StripQuotes(m.Arguments[0]);
                Visit(arr);
                return(m);
            }
            if (m.Method.Name == "Take")
            {
                var takeNumber = (int)((ConstantExpression)m.Arguments[1]).Value;
                _service.Configuration.Take = takeNumber;
                Visit(m.Arguments[0]);
                return(m);
            }
            if (m.Method.Name == "Skip")
            {
                var skipNumber = (int)((ConstantExpression)m.Arguments[1]).Value;
                _service.Configuration.Start = skipNumber;
                Visit(m.Arguments[0]);
                return(m);
            }


            if (m.Method.Name == "OrderBy" || m.Method.Name == "ThenBy")
            {
                var lambda = (LambdaExpression)StripQuotes(m.Arguments[1]);

                _service.CurrentQuery.AddSorting(lambda.Body, SolrSortTypes.Asc);

                Visit(m.Arguments[0]);

                return(m);
            }

            if (m.Method.Name == "OrderByDescending" || m.Method.Name == "ThenByDescending")
            {
                var lambda = (LambdaExpression)StripQuotes(m.Arguments[1]);
                _service.CurrentQuery.AddSorting(lambda.Body, SolrSortTypes.Desc);

                Visit(m.Arguments[0]);

                return(m);
            }



            if (m.Method.Name == "Select")
            {
                _service.CurrentQuery.Select = new LinqSolrSelect(StripQuotes(m.Arguments[1]));
                Visit(m.Arguments[0]);

                return(m);
            }


            if (m.Method.Name == "Contains")
            {
                if (m.Method.DeclaringType == typeof(string))
                {
                    var str = string.Format("*{0}*", ((ConstantExpression)StripQuotes(m.Arguments[0])).Value);


                    Visit(BinaryExpression.Equal(m.Object, ConstantExpression.Constant(str)));

                    return(m);
                }
                else
                {
                    var        arr = (ConstantExpression)StripQuotes(m.Arguments[0]);
                    Expression lambda;

                    if (m.Arguments.Count == 2)
                    {
                        lambda = StripQuotes(m.Arguments[1]);
                        Visit(lambda);
                        Visit(arr);
                    }
                    else
                    {
                        var newExpr = Expression.Equal(m.Object, m.Arguments[0]);
                        var expr    = new LinqToSolrQueryTranslator(_service, m.Arguments[0].Type);
                        expr.IsMultiList = true;
                        var multilistfq = expr.Translate(newExpr);
                        sb.AppendFormat("{0}", multilistfq);
                    }


                    return(m);
                }
            }

            if (m.Method.Name == "StartsWith")
            {
                if (m.Method.DeclaringType == typeof(string))
                {
                    var str = string.Format("{0}*", ((ConstantExpression)StripQuotes(m.Arguments[0])).Value);
                    Visit(BinaryExpression.Equal(m.Object, ConstantExpression.Constant(str)));

                    return(m);
                }
            }
            if (m.Method.Name == "EndsWith")
            {
                if (m.Method.DeclaringType == typeof(string))
                {
                    var str = string.Format("*{0}", ((ConstantExpression)StripQuotes(m.Arguments[0])).Value);
                    Visit(BinaryExpression.Equal(m.Object, ConstantExpression.Constant(str)));

                    return(m);
                }
            }

            if (m.Method.Name == "GroupBy")
            {
                _service.CurrentQuery.IsGroupEnabled = true;
                var arr = StripQuotes(m.Arguments[1]);
#if PORTABLE || NETCORE
                var solrQueryTranslator =
                    new LinqToSolrQueryTranslator(_service, ((MemberExpression)((LambdaExpression)arr).Body).Member.DeclaringType);
#else
                var solrQueryTranslator = new LinqToSolrQueryTranslator(_service,
                                                                        ((MemberExpression)((LambdaExpression)arr).Body).Member.ReflectedType);
#endif

                _service.CurrentQuery.GroupFields.Add(solrQueryTranslator.Translate(arr));
                Visit(m.Arguments[0]);

                return(m);

                //throw new Exception("The method 'GroupBy' is not supported in Solr. For native FACETS support use SolrQuaryableExtensions.GroupBySolr instead.");
            }

            throw new NotSupportedException(string.Format("The method '{0}' is not supported", m.Method.Name));
        }