我将项目交换到BreezeJS并且无法正确获取此查询。我在LINQ中使用的查询完美地完成了它。它是:
var transactionTypes = from tpt in db.TransactionPropertyTypes
from et in tpt.TransactionTypes
where tt.TransactionTypeName == transactionType.TransactionTypeName
select tpt;
其中transactionType是我传入的对象。 我的模型完美匹配。基本上有三个表。 TransactionPropertyTypes,TransactionTypes和将外键链接在一起的一个。非常感谢任何帮助!
到目前为止,我在微风中拍摄的最佳照片是:
breeze.EntityQuery.from("TransactionPropertyTypes")
.from("TransactionTypes")
.where("TransactionType.TransactionTypeName", "==", type)
.using(man).execute()
控制台打印的错误是: 错误:二进制谓词的左侧不能是文字表达式,它必须是有效属性或函数谓词表达式:TransactionType.TransactionTypeName
感谢任何帮助!
答案 0 :(得分:2)
让我用英语重申我认为你的意图是什么。
向我提供
TransactionPropertyType
中具有特定TransactionType
的所有TransactionTypes
个实例。
我假设您的TransactionPropertyType
的集合导航属性为transactionTypes
。
如果我猜错了,你就是在寻找"any" query。
这样的事情应该有效:
query = EntityQuery.from('TransactionPropertyTypes')
.where('transactionTypes', 'any',
'name', 'eq', desiredTransType.name);
重新阅读后,我发现TransactionPropertyType
和TransactionType
与多对多相关。 Breeze还不支持多对多关系。
但是你也说过你可以将实现关系的映射表作为一个实体来表示。
你没有说出它的名字;我将其称为TransPropTransTypeMap
。我假设有一个直通导航路径TransactionPropertyType.transPropTransTypeMaps.transactionType
。
重写的查询变为:
query = EntityQuery.from('TransactionPropertyTypes')
.where('transPropTransTypeMaps', 'any',
'transactionType.name', 'eq', desiredTransType.name);
我刚刚添加了一个ngDocCode:query_with_predicates测试,它为Northwind m-to-m关系做了同样的事情,' Order-OrderDetail-Product',其中OrderDetail
扮演映射实体的角色。
it("an ANY predicate through a many-to-many mapping table", function (done) {
// Get first Order with an OrderDetail that has a product named 'Chai'
// OrderDetail is the mapping table in this scenario:
// Order <-(1,M)-> OrderDetail <-(M,1)-> Product
var pred = new Predicate('OrderDetails', 'any',
'Product.ProductName', 'eq', 'Chai');
EntityQuery.from('Orders')
.where(pred)
.top(1)
.expand('OrderDetails.Product')
.using(em).execute().then(success).then(done, done);
function success(data){
var order = data.results[0] || {};
var hasChai = order.OrderDetails.some(function(od){
return od.Product.ProductName === 'Chai';
});
expect(hasChai).to.be.true;
}
});
答案 1 :(得分:0)
创建谓词对象
Breeze允许创建和构建复杂的谓词:
var Predicate = breeze.Predicate;
var mypred = Predicate.Create("TransactionType.TransactionTypeName", "==", valueToFind);
// If more clauses, add them like this
if (2ndValueToFind) {
mypred = mypred.and(Predicate.create('AnotherField', '==', 2ndValueToFind));
}
breeze.EntityQuery.from("TransactionPropertyTypes")
.from("TransactionTypes")
.where(mypred)
.using(man).execute()
我不相信这会解决多对多问题,但它非常有用。