我没有对几周前出现的1.4.16发布而测试过这一点,但发布说明中没有任何内容。

问题发生在谓词中,您要比较的值与Breeze知道的任何实体上的属性的名称相同。一个简单的测试用例是:

var query = breeze.EntityQuery.from('Items');

var pred = breeze.Predicate.create('name', breeze.FilterQueryOp.Contains, searchTerm);

query = query.where(pred);
.

其中searchterm等于除“名称”以外的任何字符串,这会产生如下所示的ODATA查询:

Items?$filter=(substringof(%27somevalue%27%2CName)%20eq%20true)
.

但如果searchterm=“name”则生成以下查询

Items?$filter=(substringof(Name%2CName)%20eq%20true)
.

将字符串“name”与属性名称进行比较,它将其自身与属性名称进行比较。

我没有测试每个运营商,但据我所知,你使用的是你的行为不重要。

查询导航属性时也会出现相同的问题,但通常会导致无效查询。下面是对同一实体的谓词,但是对导航属性标签,其中包含对它们上具有“标记”属性的项目标签实体集合。

breeze.Predicate.create('tags', breeze.filterQueryOp.Any, 'tag', breeze.filterQueryOp.Contains, searchTerm)
.

它适用于除“标签”之外的任何SearchTerm工作,其中它产生ODATA请求,如下所示:

Items?$filter=Tags%2Fany(x1%3A%20substringof(%27somevalue%27%2Cx1%2FTag)%20eq%20true)
.

但如果searchterm是“标签”,那么它请求:

Items?$filter=Tags%2Fany(x1%3A%20substringof(Tag%2Cx1%2FTag)%20eq%20true) 
.

产生错误的错误“无法在”项目“上找到名为”标记“的属性”,因为属性标记存在于Itemtag实体上。

短风似乎推断出与它所知道的属性名称相同的搜索项是指该属性而不是字符串文字值。

有其他人遇到过这个吗?

是这个错误,或者有没有办法明确地告诉breeze将该值解释为字符串文字,而不是对属性的引用?

我不确定它与服务器似乎正确响应请求,它是一种微风,它正在创建不正确的请求,但是在服务器端,我正在使用与ef的Web API ODATA控制器作为ORM数据层。< / p>

有帮助吗?

解决方案

尝试

var pred = breeze.Predicate.create('name', breeze.FilterQueryOp.Contains, 
 { value: searchTerm, isLiteral: true} );
.

此处描述(根据值参数的说明): http://www.breezejs.com/sites/all/apidocs / classes/predicate.html#method_create

如果该值可以被解释为属性表达式,否则将被视为文字。 在大多数情况下,这效果很好,但是您还可以通过使值参数本身具有“值”属性的对象和“isliteral”属性设置为true或false来强制解释。 Breeze还尝试根据上下文推断任何文字的数据类型,如果这失败,则可以通过使值参数具有“值”属性和'DataType'Property Set来强制此推理 到了一个breeze.datatype枚举实例。

此逻辑的原因是允许表达式表达式的表达式是属性。例如,要查询具有相同名字和姓氏的员工,您可以执行以下操作:

var q = EntityQuery.from("Employees")
        .where("lastName", "==", "firstName");
.

虽然如果您想要具有“FirstName”的LastName的员工,您将执行以下操作:

var q = EntityQuery.from("Employees")
        .where("lastName", "startsWith", { value: "firstName", isLiteral: true })
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top