我如何编写一个等效于以下SQL的breeze Predicate

Joh*_*tle 1 sql breeze

SELECT 
    * 
FROM
    Table
WHERE 
  FirstName = 'Wilson' 
  AND (START_DATE = '1/1/2014' OR START_DATE > '1/2/2014')
Run Code Online (Sandbox Code Playgroud)

War*_*ard 5

@自由职业者的答案朝着正确的方向前进......但我的口味有点冗长.

DateTime分析查询时,我也不相信我可以指望将'1/1/2014'自动转换为值.当我尝试这样的谓词时:

var p2 = breeze.Predicate.create('StartDate', '>', '1/2/2014')

Breeze在我的查询中抛出错误.

错误:'1/2/2014'不是有效的dateTime

这是另一种选择:

var pred = breeze.Predicate
            // weird: any day in 2014 except Jan 2nd ???
            .create('StartDate', '==', new Date('1/1/2014'))
            .or(    'StartDate', '>',  new Date('1/2/2014'))
            .and(   'FirstName', '==', 'Wilson');

var query= breeze.EntityQuery.from("GetTables").where(pred);
Run Code Online (Sandbox Code Playgroud)

注意谓词的从左到右的组合.

  1. create呼叫谓词创建日期平等谓词

  2. or调用返回一个谓词,该谓词是第一个谓词和第二个日期条件的OR.这是OR谓词

  3. 第三个and调用返回OR谓词的AND和名称测试.

这是一个很好的技巧,可以将谓词显示为OData查询子句:

// Should use the target EntityType but this dummy will do for now
var dummyEntityType = new EntityType(new breeze.MetadataStore());
console.log("OData predicate: " + pred.toODataFragment(dummyEntityType )));
Run Code Online (Sandbox Code Playgroud)

它打印

OData谓词:((StartDate eq datetime'2014-01-01T08:00:00.000Z')或(StartDate gt datetime'2014-01-02T08:00:00.000Z'))和(FirstName eq'Wilson')

日期很棘手!

你没有问,但我会给你我0.02美元的日期风险.

首先,我想确定我在数据库中的日期没有时间组件......或者这个查询根本不起作用,因为数据库中没有'StartDate将通过相等测试.

其次,使用这样的文本日期存在国际化问题的风险.是'1/2/2014'应该是1月2日或2月1日?我通过提供实际日期值来消除歧义,如下一个例子所示.

var pred = breeze.Predicate
            .create('StartDate', '==', new Date(2014, 0, 1)) // Jan===0 in JavaScript
            .or(    'StartDate', '>',  new Date(2014, 0, 2))
            .and(   'FirstName', '==', 'Wilson');
Run Code Online (Sandbox Code Playgroud)

这个谓词(如上所述)产生

OData谓词:((StartDate eq datetime'2014-01-01T08:00:00.000Z')或(StartDate gt datetime'2014-01-02T08:00:00.000Z'))和(FirstName eq'Wilson')

第三,现在你有一个潜在的时区问题.我想确定通过在客户端和服务器上执行UTC中的所有操作来消除TIMEZONE效果.所以我实际上写道:

var pred = breeze.Predicate
            .create('StartDate', '==', new Date(Date.UTC(2014, 0, 1))) // Jan===0 in JavaScript
            .or(    'StartDate', '>',  new Date(Date.UTC(2014, 0, 2)))
            .and(   'FirstName', '==', 'Wilson');
Run Code Online (Sandbox Code Playgroud)

这个谓词产生:

OData谓词:((StartDate eq datetime'2014-01-01T00:00:00.000Z')或(StartDate gt datetime'2014-01-02T00:00:00.000Z'))和(FirstName eq'Wilson')