Breeze查询包括已过滤的相关实体

时间:2017-11-29 15:42:02

标签: breeze

我有一个有订单的用户。我想选择用户并展开订单以仅包含Orders.valid == true。像这样:

// This is just a pseudo-query of what I want to achieve    
// Note singluar 'Order.valid' also does not work
let query= new Predicate('guid', 'eq', this.user.guid).and(new Predicate('Orders.valid', 'eq', 'true');\
let users= this.uow.userSet.where(query, ['Orders']);

where()方法取自TempHire存储库并稍作修改:

where(predicate: Predicate, expand: string[] = null): Promise<any[] | Entity[]> {
    return new Promise<any[] | Entity[]>((resolve) => {
        let query = this.baseQuery().where(predicate)
        if(expand) query = query.expand(expand);

上述查询无效,因为where条件无法应用于作为集合的Entity属性。

要在客户端解决此问题,我只需实现两个查询,一个用于获取用户,另一个用于获取用户有效的订单。我更愿意将其作为单个查询。

我也尝试在服务器端解决这个问题。我正在使用[BreezeController]公开一个Breeze EFContextProvider<>,然后再次使用TempHire方法将每个实体集合公开为IQueryable<>。在OrderSet()内,我尝试了以下代码:

return _efContext.Context.OrderSet.Where(o => o.valid);

但是,当查询直接发送到UserSet()微风时,似乎不会使用公开的OrderSet()方法来扩展用户的Orders属性。

我考虑直接在Orders内扩展UserSet()属性以始终包含有效订单(使用Linq),但我并不总是希望Orders为每个查询返回UserSet {1}}我不确定BreezeController是否会删除这些不需要的包含。

是否有更好/不同的方式来实现客户端或服务器端,而不是简单地对服务器进行多次调用,并在每个实体集上设置个别where子句?

也许我应该创建一个UserOrderSet()端点并在我想要一个有效订单的用户时直接调用它?想法?

1 个答案:

答案 0 :(得分:1)

我明白了!

我开始阅读http://briannoyesblog.azurewebsites.net/2014/02/13/passing-complex-query-parameters-with-breeze/

这引导我创建一个微风查询,接受我想要检索的实体的参数:

const path = require('path');
const webpack = require('webpack');

function config(env) {
    return {
        entry: {
            index: ['./src/page1.js']
        },
        output: {
            filename: '[name].bundle.js',
            chunkFilename: '[name].bundle.js',
            path: path.resolve(__dirname, 'dist'),
            publicPath: './'
        },
        module: {
            rules: [
                {
                    test: /\.js$/i,
                    include: /src/,
                    exclude: /node_modules/,
                    use: {
                        loader: 'babel-loader'
                    }
                }
            ]
        },
        devtool: 'source-map'
    };
}

module.exports = config;

注意breeze方法返回的实体不是IQueryable&lt;&gt;。这很关键。此外,只需使用过滤条件执行EF查询,就可以将这些“活动”订单附加到User.Orders集合属性。

客户端网站我将直接调用此方法,而不需要第二个查询来加载“活动”订单。

我希望将来可以帮助某人。

顺便说一句,我越是使用BreezeJS,我就越喜欢它。我的帽子是他们出色的工作!

再次感谢,

麦克