如何在BreezeJS中执行此LINQ查询?

时间:2014-11-21 03:58:26

标签: linq typescript breeze

我将项目交换到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

感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

只有一个来自'条款

史蒂夫的解决方案不会起作用,因为你不能从"中获得双倍的解决方案。条款。

让我用英语重申我认为你的意图是什么。

  

向我提供TransactionPropertyType中具有特定TransactionType的所有TransactionTypes个实例。

我假设您的TransactionPropertyType的集合导航属性为transactionTypes

如果我猜错了,你就是在寻找"any" query

这样的事情应该有效:

query = EntityQuery.from('TransactionPropertyTypes')
                   .where('transactionTypes', 'any',
                      'name', 'eq', desiredTransType.name);

多对多

重新阅读后,我发现TransactionPropertyTypeTransactionType多对多相关。 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()

我不相信这会解决多对多问题,但它非常有用。