加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – Web API,OData,$inlinecount和测试

发布时间:2020-12-16 07:36:18 所属栏目:asp.Net 来源:网络整理
导读:我之前有一个Web API控制器,如下所示: public IQueryableApiDesignOverview GetList( string brandIds = "",string categoryIds = "",string query = "",string categoryOp = "or") 我听说OData NuGet包现在支持$inlinecount OData参数,所以我尝试使用http:
我之前有一个Web API控制器,如下所示:

public IQueryable<ApiDesignOverview> GetList(
        string brandIds = "",string categoryIds = "",string query = "",string categoryOp = "or")

我听说OData NuGet包现在支持$inlinecount OData参数,所以我尝试使用http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options中的指令添加它 – 我不想使用OData批发,因为这将需要大量的重新构建应用程序,所以我去了PageResult< T>选项.

所以现在我的控制器看起来像这样:

public PageResult<ApiDesignOverview> GetList(
        ODataQueryOptions<ApiDesignOverview> options,string brandIds = "",string categoryOp = "or")

我现在的问题是:

>如何模拟ODataQueryOptions进行单元测试?
>如果他们不能被嘲笑,我该如何创建?我需要一个ODataQueryContext来构造一个,这需要一个Microsoft.Data.Edm.IEdmModel,这需要……什么?我找不到任何相关的文档.

真的,如果我像以前一样从控制器签名中删除ODataQueryOptions会更好.这可能吗?

解决方法

如果您更喜欢返回IQueryable并希望支持$inlinecount,那么仍然可以通过对QueryableAttribute进行编码来实现.

public class InlineCountQueryableAttribute : QueryableAttribute
{
    private static MethodInfo _createPageResult =
        typeof(InlineCountQueryableAttribute)
        .GetMethods(BindingFlags.Static | BindingFlags.NonPublic)
        .Single(m => m.Name == "CreatePageResult");

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        base.OnActionExecuted(actionExecutedContext);

        HttpRequestMessage request = actionExecutedContext.Request;
        HttpResponseMessage response = actionExecutedContext.Response;

        IQueryable result;
        if (response.IsSuccessStatusCode
            && response.TryGetContentValue<IQueryable>(out result))
        {
            long? inlineCount = request.GetInlineCount();
            if (inlineCount != null)
            {
                actionExecutedContext.Response = _createPageResult.MakeGenericMethod(result.ElementType).Invoke(
                    null,new object[] { request,request.GetInlineCount(),request.GetNextPageLink(),result }) as HttpResponseMessage;
            }
        }
    }

    internal static HttpResponseMessage CreatePageResult<T>(HttpRequestMessage request,long? count,Uri nextpageLink,IEnumerable<T> results)
    {
        return request.CreateResponse(HttpStatusCode.OK,new PageResult<T>(results,nextpageLink,count));
    }
}

请注意,我使用反射来创建PageResult.您可以改为返回您喜欢的对象,该对象可以由您使用的格式化程序格式化.如果您使用Json格式化程序,则具有结果和计数的匿名对象也将起作用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读