C# webapi响应的全局查询参数

C# webapi响应的全局查询参数,c#,asp.net-web-api,delegatinghandler,C#,Asp.net Web Api,Delegatinghandler,我有一个RESTfulWebAPI,我想支持一个queryparameter来搜索类似?q= 我想做的是使用delegatingHandler来更改响应 基本上为每种类型的资源创建一个查询句柄 BaseQueryHandler方法看起来是这样的 HttpResponseMessage IQueryHandler.Query(HttpResponseMessage response, string query) { httpResponse = respon

我有一个RESTfulWebAPI,我想支持一个queryparameter来搜索类似
?q=

我想做的是使用delegatingHandler来更改响应 基本上为每种类型的资源创建一个查询句柄

BaseQueryHandler方法看起来是这样的

HttpResponseMessage IQueryHandler.Query(HttpResponseMessage response, string query)
        {
            httpResponse = response;

            T content;
            if (response.TryGetContentValue(out content))
            {
               response = Request.CreateResponse(Query(content, query));
            }

            return response;
        }
像这样的混凝土工

  public override Organization Query(Organization content, string query)
    {
        query = query.ToLower();
        var organization = content.ChildOrganizations?.Where(o => o.Name.ToLower().Contains(query));
        return  
    }
更新: 我一定会去看看小田

到目前为止,我所做的是实现QueryHandler,然后使用扩展方法搜索对象中的字段和值

public static IEnumerable<T> LikeOr<T>(this IEnumerable<T> source, string columnName, string searchTerm)
        {
            IEnumerable<string> words =
                searchTerm.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries).Where(x => x.Length > 1);

            var sb = new StringBuilder();
            for (int i = 0; i < words.Count(); i++)
            {
                if (i != 0)
                    sb.Append(" || ");

                sb.Append(words.First().IsNumeric() ? $"{columnName} = @{i}" : $"{columnName}.Contains(@{i})");
            }

            var intSearch = 0;
            if (int.TryParse(words.First(), out intSearch))
                return source.Where(sb.ToString(), intSearch);

            return source.Where(sb.ToString(), words.ToArray());
        }
公共静态IEnumerable LikeOr(此IEnumerable源、字符串列名、字符串搜索项)
{
数词=
searchTerm.Split(新[]{”“},StringSplitOptions.RemoveEmptyEntries)。其中(x=>x.Length>1);
var sb=新的StringBuilder();
for(int i=0;i
然后在我的具体SearchHandler实现中使用它,就像这样

public override IEnumerable<Organization> Search(IEnumerable<Organization> content, string query)
    {
        var searchTerm = query.Split(':');
        var field = searchTerm[0];
        var term = searchTerm[1];
        var entitites = content.LikeOr(field, term);
        return entitites;
    }
public覆盖IEnumerable搜索(IEnumerable内容,字符串查询)
{
var searchTerm=query.Split(“:”);
var字段=搜索项[0];
var术语=搜索术语[1];
var entitites=content.LikeOr(字段、术语);
返回实体;
}
(事实上,在另一个关于dynamic.Linq的回答中发现了这一点(不记得URL,当我重新查找它时会更新,以给予适当的信任)

你们有没有更好的方法


通常情况下,您可以在所有操作上正确地使用查询参数,我不希望这样:)

如果您想让客户按照他想要的方式查询您的数据,是否查看了?您应该明确查看。如果您想让客户按照他想要的方式查询您的数据,是否查看了?您应该明确查看。