【问题标题】:Applying query options on typeless entity在无类型实体上应用查询选项
【发布时间】:2014-05-27 10:10:51
【问题描述】:

如何将查询选项应用于非 clr 类型。 .ApplyTo 方法在我使用时会引发错误。

错误:

"查询选项未绑定任何 CLR 类型。'ApplyTo' 仅 支持绑定到 CLR 类型的查询选项。"

var x = (EdmCollectionType)Request.GetODataPath().EdmType;
ODataQueryContext queryContext = new ODataQueryContext(Request.GetEdmModel(), x.ElementType.Definition);
ODataQueryOptions queryOptions = new ODataQueryOptions(queryContext, Request);

//codes.....

queryOptions.ApplyTo(Products);

【问题讨论】:

    标签: c# asp.net-web-api odata


    【解决方案1】:

    正如错误所说,查询选项现在不能应用于非 clr 类型。

    这是因为现在 webapi 需要 clr 类型来生成查询选项的 linq 表达式。

    但是,您可以使用查询选项中的原始值自行在非 clr 类型上实现 ApplyTo 函数:

    queryOptions.Filter.RawValue
    queryOptions.OrderBy.RawValue
    ...
    

    【讨论】:

    【解决方案2】:
    ODataQueryContext queryContext = new ODataQueryContext(Request.GetEdmModel(), x.ElementType.Definition);
    

    在上述行中,我们需要将 Class Type obj 显式传递给 ODataQueryContext。 让我们假设一个名为 A 的类型是在运行时创建的。

    Type a = //Get the type at runtime ;
    ODataQueryContext queryContext = new ODataQueryContext(Request.GetEdmModel(), a);
    

    这应该解决异常。

    现在,来到 ApplyTo(),我们可以将 A 类型的实例传递给它。

    object instance = Activator.CreateInstance(a);
    odataQuerySetting.ApplyTo(instance,, new ODataQuerySettings() { });
    

    但是,我们希望针对一组对象和一个实例运行 ApplyTo()。 Array 类可以帮助我们实现这一点。假设我们需要创建 10 个实例:

    Array values = Array.CreateInstance(a, 10);
    for (int i = 0; i < 10; i++)
            {
                values.SetValue(Activator.CreateInstance(t), i);
            }
    

    不用说,我们可以根据需要向实例添加属性,然后将其传递给 SetValue()。 最后,可以对我们的列表执行 ApplyTo(),如下所示:

      queryOptions.ApplyTo(values.AsQueryable());
    

    注意:如果您得到状态:406,那么一个可能的原因可能是 JsonFormat。使用自定义 MediaTypeFormatter 来解决这个问题。

    我希望这可能对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-02
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多