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

C# 在无类型实体上应用查询选项,c#,asp.net-web-api,odata,C#,Asp.net Web Api,Odata,如何在非clr类型上应用查询选项。.ApplyTo方法在我使用时抛出了一个错误 错误: “查询选项未绑定到任何CLR类型。'ApplyTo'仅为” 绑定到CLR类型的查询选项支持。“ 正如错误所说,查询选项现在不能应用于非clr类型 这是因为现在webapi需要clr类型来为查询选项生成linq表达式 但是,您可以使用查询选项中的原始值在非clr类型上实现ApplyTo函数: queryOptions.Filter.RawValue queryOptions.OrderBy.RawValue .

如何在非clr类型上应用查询选项。.ApplyTo方法在我使用时抛出了一个错误

错误:

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


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

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

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

queryOptions.Filter.RawValue
queryOptions.OrderBy.RawValue
...
在上面的代码行中,我们需要显式地将类类型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);
        }
注意:如果您得到状态:406,那么一个可能的原因可能是JsonFormat。使用自定义MediaTypeFormatter解决此问题


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

您能否发布一个关于如何按函数应用订单的示例检查此示例代码,希望它能对您有所帮助。
object instance = Activator.CreateInstance(a);
odataQuerySetting.ApplyTo(instance,, new ODataQuerySettings() { });
Array values = Array.CreateInstance(a, 10);
for (int i = 0; i < 10; i++)
        {
            values.SetValue(Activator.CreateInstance(t), i);
        }
  queryOptions.ApplyTo(values.AsQueryable());