/// <summary> /// Apply the $search query to the given IQueryable. /// </summary> /// <remarks> /// The <see cref="ODataQuerySettings.HandleNullPropagation"/> property specifies how this method should handle null propagation. /// </remarks> /// <param name="query">The original <see cref="IQueryable"/>.</param> /// <param name="querySettings">The <see cref="ODataQuerySettings"/> that contains all the query application related settings.</param> /// <returns>The new <see cref="IQueryable"/> after the filter query has been applied to.</returns> public IQueryable ApplyTo(IQueryable query, ODataQuerySettings querySettings) { if (query == null) { throw Error.ArgumentNull(nameof(query)); } if (querySettings == null) { throw Error.ArgumentNull(nameof(querySettings)); } ISearchBinder binder = Context.GetSearchBinder(); if (binder == null) { // If the developer doesn't provide the search binder, let's ignore the $search clause. return(query); } if (Context.ElementClrType == null) { throw Error.NotSupported(SRResources.ApplyToOnUntypedQueryOption, "ApplyTo"); } QueryBinderContext binderContext = new QueryBinderContext(Context.Model, querySettings, Context.ElementClrType); return(binder.ApplyBind(query, SearchClause, binderContext)); }
/// <summary> /// Translate an OData $search parse tree represented by <see cref="SearchClause"/> to /// an <see cref="Expression"/> and applies it to an <see cref="IQueryable"/>. /// </summary> /// <param name="binder">The built in <see cref="ISelectExpandBinder"/></param> /// <param name="source">The original <see cref="IQueryable"/>.</param> /// <param name="searchClause">The OData $search parse tree.</param> /// <param name="context">An instance of the <see cref="QueryBinderContext"/>.</param> /// <returns>The applied result.</returns> public static IQueryable ApplyBind(this ISearchBinder binder, IQueryable source, SearchClause searchClause, QueryBinderContext context) { if (binder == null) { throw Error.ArgumentNull(nameof(binder)); } if (source == null) { throw Error.ArgumentNull(nameof(source)); } if (searchClause == null) { throw Error.ArgumentNull(nameof(searchClause)); } if (context == null) { throw Error.ArgumentNull(nameof(context)); } Expression searchExp = binder.BindSearch(searchClause, context); return(ExpressionHelpers.Where(source, searchExp, context.ElementClrType)); }