如何在非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);
答案 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可以解决该问题。
我希望这可以对某人有所帮助。