【问题标题】:Jaydata Odata Unknown expression type to handle: EntitySetExJaydata Odata 要处理的未知表达式类型:EntitySetEx
【发布时间】:2013-10-15 08:29:29
【问题描述】:

我收到此错误:“要处理的未知表达式类型:EntitySetExpression” 尝试对 Odata 导航属性进行筛选或排序时。

    App.store.Person.include('Friend')
    .filter("it.age >= 10 && it.Friend.age >=10").toArray();

如果我在订单函数中包含导航属性,我会得到同样的错误:

App.store.Person.include('Friend').orderBy("it.Friend.age").toArray();

关于为什么这不应该工作的任何想法? 谢谢

编辑: 我的问题有点误导!我试图在同一个查询中过滤导航属性本身。我也错误地认为 JayData 会将导航属性作为 Queryable 对象返回。

【问题讨论】:

  • Include 将在您使用 odata 时转换为 $expand。您不能对 $expand 进行过滤或排序。这是 odata 而不是 jaydata 的限制。其实用sql也很难。

标签: odata jaydata datajs


【解决方案1】:

我猜 Person 和 Friend 是 1-N 关系,因此对于过滤器,您需要 some() 或 every() 操作,请参见:Using JayData to filter Header Detail Table - Inner Join SQL, oData

orderby() 我还在寻找

【讨论】:

  • 感谢@Gabor,我看过这篇文章,但不幸的是它实际上并没有返回过滤的导航属性,而是返回了父对象,它有一些或所有与谓词匹配的项目。也许我做错了。我是否必须创建 2 个单独的查询。我有时会忘记 JSQL 不是 LINQ!
  • 这应该可以,请尝试: var subquery = App.store.Friends.filter('it.age >= 10'); App.store.Person.include('Friend') .filter("it.age >= 10 && it.Friend.some(this.subquery)", { subquery: subquery }).toArray();
  • 请注意,它会返回所有 10 岁以上的人,他的任何一个朋友都超过 10 岁,但会返回他所有的朋友,而不仅仅是他 10 岁以上的朋友!
  • 您不能在 include 上设置条件... 您有两个选择:1. 在客户端过滤,这真的很简单 2. 将过滤器更改为过滤 Friend 而不是人,如 Friend.filter('it.age > 10 和 it.Person.age > 10').include('Person') 但在这种情况下,朋友不会按人分组...
  • 另外,你不能做.orderBy("it.Friend.age"),你也可以在客户端排序
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2019-11-10
  • 2020-04-17
相关资源
最近更新 更多