在无类型实体上应用查询选项

时间:2014-05-27 10:10:52

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

如何在非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);

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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()。 数组类可以帮助我们完成此任务。假设我们需要创建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可以解决该问题。

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