BreezeJS 的二进制谓词问题的左侧

Posted

技术标签:

【中文标题】BreezeJS 的二进制谓词问题的左侧【英文标题】:the left hand side of a binary predicate issue with BreezeJS 【发布时间】:2017-06-16 05:21:42 【问题描述】:

我在使用 BreezeJS 的过滤谓词方面遇到了问题。当我为过滤器集的一个特定过滤器分配一个值时,我收到客户端(浏览器)错误:'二进制谓词的左侧不能是文字表达式,它必须是有效的属性或功能谓词表达式:'

我也在使用 KnockoutJS,并且我有一些辅助函数可以将谓词放在一起,但是,对于这个不起作用的特定过滤器,我没有做任何不同的事情。

我已经将此谓词与从另一个有效的过滤器创建的谓词进行了比较,据我所知,这两个谓词在它们应有的方式上是相同的,我没有看到任何不应该存在的差异。一位 SME 建议检查我的外壳,但是,这不是问题(我可以说) - IOW,外壳在 db 和视图模型之间是一致的。有人有什么建议吗?

代码:

这是由微风控制器发送的元数据,用于过滤器不起作用(GoofyGuy)和一个过滤器,因此您可以看到元数据基本相同


 "name": "GoofyGuy",
 "type": "Edm.String",
 "nullable": "false",
 "maxLength": "256",
 "fixedLength": "false",
 "unicode": "true"
,

 "name": "Priority",
 "type": "Edm.String",
 "nullable": "false",
 "maxLength": "256",
 "fixedLength": "false",
 "unicode": "true"
,

这里是 html 绑定:

<select data-bind="value: GoofyGuy().filterValue">
  <option value="">Select</option>
  <option>Approval Hold</option>
  <option>Approved</option>
  <option>Deleted</option>
  <option>Executed</option>
  <option>Execution Hold</option>
  <option>Off Hold</option>
  <option>Submitted</option>
  <option>Verification Hold</option>
  <option>Verified</option>
 </select>

这是模型:

function Filter_ChangeRequest(canViewOthers) 
var self = this;
self.filterName = '',
self.filterType = 'changeRequest',
    self.dateCreated = ko.observable('');
self.isActive = ko.observable(true),
self.submitter = ko.observable(new FilterValue()),
self.deadline = ko.observable(new FilterComparison()),
self.priority = ko.observable(new FilterValue()),
self.GoofyGuy = ko.observable(new FilterValue()),
self.requestId = ko.observable(new FilterValue()),
self.itemTitle = ko.observable(new FilterValue()),
self.domain = ko.observable(new FilterValue()),
self.policyWaiver = ko.observable(new FilterValue()),
self.submitDate = ko.observable(new FilterComparison()),
self.approvedBy = ko.observable(new FilterValue()),
self.description = ko.observable(new FilterValue()),
self.canViewOthers = canViewOthers,
self.submitters = ['amr\\maburke', 'amr\\jdkraft'],
self.idsid = '';

self.setInitialValues = function () 
    self.submitter(new FilterValue('SubmittedByIdsid'));
    self.deadline(new FilterComparison('DeadlineRequested'));
    self.priority(new FilterValue('Priority'));
    self.GoofyGuy(new FilterValue('GoofyGuy'));
    self.requestId(new FilterValue('RequestId'));
    self.itemTitle(new FilterValue('Title'));
    self.domain(new FilterValue('Domain'));
    self.policyWaiver(new FilterValue('IncludesPolicyWaiver'));
    self.submitDate(new FilterComparison('SubmitDate'));
    self.approvedBy(new FilterValue('ApprovedBy'));
    self.description(new FilterValue('Description'));
    self.submitters = ['amr\\maburke', 'amr\\jdkraft'];
;

self.init = function () 
    self.setInitialValues();


;
self.clear = function () 
    self.setInitialValues();
;

self.populate = function (filterValues) 
    if (self.canViewOthers)
        self.submitter().populate(filterValues.submitter);
    self.deadline().populate(filterValues.deadline);
    self.priority().populate(filterValues.priority);
    //self.GoofyGuy().populate(filterValues.GoofyGuy);
    self.requestId().populate(filterValues.requestId);
    self.itemTitle().populate(filterValues.itemTitle);
    self.domain().populate(filterValues.domain);
    self.policyWaiver().populate(filterValues.policyWaiver);
    self.submitDate().populate(filterValues.submitDate);
    self.approvedBy().populate(filterValues.approvedBy);
    self.description().populate(filterValues.description);
;

self.breezeFilter = function () 
    var filterPredicates = ko.observableArray([]);
    //breezeUtils.addPredicate(self.submitter(), filterPredicates);
    //breezeUtils.addPredicate(self.deadline(), filterPredicates);

    //if (self.stateX().filterValue() == '')
    //    //add != Deleted predicate
    //    filterPredicates.push(breeze.Predicate.create('StateNameX', breeze.FilterQueryOp.NotEquals, 'Deleted'));
    //else
    breezeUtils.addPredicate(self.GoofyGuy(), filterPredicates);
    //breezeUtils.addPredicate(self.priority(), filterPredicates);
    //breezeUtils.addPredicate(self.itemTitle(), filterPredicates);
    //breezeUtils.addPredicate(self.domain(), filterPredicates);
    //breezeUtils.addPredicate(self.policyWaiver(), filterPredicates);
    //breezeUtils.addPredicate(self.submitDate(), filterPredicates);
    //breezeUtils.addPredicate(self.approvedBy(), filterPredicates);
    //breezeUtils.addPredicate(self.description(), filterPredicates);
    //breezeUtils.addPredicate(self.requestId(), filterPredicates);

    return breeze.Predicate.and(filterPredicates());


;

然后这些是弹出谓词的辅助函数:

var breezeUtils = 
Predicate: breeze.Predicate,
FilterQueryOp: breeze.FilterQueryOp,
addPredicate: function (filter, predicateCollection) 
    if (filter.filterValue()) 
        //if there is a filter value, add it to the predicate collection
        predicateCollection.push(this.getPredicate(filter));
    
,
getPredicate: function (filter) 
    if (filter.hasOwnProperty('boundary') && filter.boundary())  //compound predicate
        var p1 = this.Predicate.create(filter.title, this.FilterQueryOp.GreaterThanOrEqual, filter.filterValue());
        var p2 = this.Predicate.create(filter.title, this.FilterQueryOp.LessThanOrEqual, filter.boundary());
        return this.Predicate.and([p1, p2]);
    
    var operator = this.getQueryOperator(filter.valueComparison());
    return this.Predicate.create(filter.title, operator, filter.filterValue());
,

最后,这是发送到服务器之前的谓词集,以说明两个过滤器再次基本相同:

在下面的评论中,我指出即使将服务器和客户端上的所有内容更改为使用“goofy”,我仍然会收到相同的错误:

【问题讨论】:

在进行更多更改并查看开发工具中的网络面板时,会在将查询发送到控制器执行之前引发此错误 - 这完全是客户端问题。 我发现了这个问题。我已将用于从基表弹出 UI 的实体更改为组合视图。微风控制器上的操作与基础表实体具有相同的名称。当我更新底层源时,我更改了操作以返回正确的类型集合,但是操作名称保持不变。因此,当需要创建谓词时,由微风创建的 defaultResourceName 仍然是旧实体,而不是新实体。碰巧这是唯一能说明这个特殊问题的过滤器。 【参考方案1】:

外壳确实在 GoofyGuy 和其他所有东西之间看起来不同。例如:

self.priority(new FilterValue('Priority'));
self.GoofyGuy(new FilterValue('GoofyGuy'));

我认为 Breeze 是对名称进行驼峰式命名(使用 NamingConvention),然后尝试匹配(客户端)属性名称。所以:

"Priority" -> priority // works
"GoofyGuy" -> goofyGuy // Breeze can't find the property

在任何地方将 self.GoofyGuy 更改为 self.goofyGuy,这应该可以解决问题。

【讨论】:

我会看看这个特定的改变是否有帮助。我 99% 确定在我把它改成全大写之前它是 goofyGuy,我不能肯定的原因是最初,该列被称为“状态”,而相应的 js 对象属性是“状态” ,所以我改变了它以避免在微风库中可能发生的冲突,但它已经经历了几个排列。你的建议确实让我觉得我需要检查我所有的外壳,所以,我会尝试一些事情并发布我的结果,如果有的话。 我将 EF 模型更改为使用“Goofy”,并将客户端更改为使用“goofy”,这导致抛出相同的错误。服务器属性是一个单词大写,客户端一个单词小写的其他过滤器,例如上面的 - 'Priority' 这令人沮丧:将服务器端属性更改为“goofy”,即使客户端属性为“goofy”,仍然会出现相同的错误。

以上是关于BreezeJS 的二进制谓词问题的左侧的主要内容,如果未能解决你的问题,请参考以下文章

在 c# 中,是不是有任何理由在十进制格式的左侧有相邻的 #?

BreezeJS 可以与 MySQL + NodeJS + AngularJS 一起使用吗?

位操作将最左侧的设置位转换为右侧的交替位?

改进 sql 中的文本搜索

将 lambda 传递给函数模板

在二进制数中,为什么会有原码反码补码