如何编写等价于以下SQL的breeze谓词

如何编写等价于以下SQL的breeze谓词,sql,breeze,Sql,Breeze,假设您有控制器,并且它有: SELECT * FROM Table WHERE FirstName = 'Wilson' AND (START_DATE = '1/1/2014' OR START_DATE > '1/2/2014') 查询将是: var p1 = new breeze.Predicate.create("FirstName ", "==", "Wilson"); var p2 = new breeze.Predicate.create("

假设您有控制器,并且它有:

SELECT 
    * 
FROM
    Table
WHERE 
  FirstName = 'Wilson' 
  AND (START_DATE = '1/1/2014' OR START_DATE > '1/2/2014')
查询将是:

var p1 = new breeze.Predicate.create("FirstName ", "==", "Wilson");
var p2 = new breeze.Predicate.create("START_DATE ", "==", "1/1/2014");
var p3 = new breeze.Predicate.create("START_DATE ", ">", "1/1/2014");
var orPred = new breeze.Predicate.or(p2, p3);
var andPred = Predicate.and(p1, orPred );
// You should parse "1/1/2014" to DateTime type first

假设您有控制器,并且它有:

SELECT 
    * 
FROM
    Table
WHERE 
  FirstName = 'Wilson' 
  AND (START_DATE = '1/1/2014' OR START_DATE > '1/2/2014')
查询将是:

var p1 = new breeze.Predicate.create("FirstName ", "==", "Wilson");
var p2 = new breeze.Predicate.create("START_DATE ", "==", "1/1/2014");
var p3 = new breeze.Predicate.create("START_DATE ", ">", "1/1/2014");
var orPred = new breeze.Predicate.or(p2, p3);
var andPred = Predicate.and(p1, orPred );
// You should parse "1/1/2014" to DateTime type first

@自由职业者的答案是正确的。。。但对我的口味来说有点冗长

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

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

Breeze在我的查询中抛出了一个错误

错误:“1/2/2014”不是有效的日期时间

这里有一个替代方案:

var query= new breeze.EntityQuery().from("GetTables").where(andPred);
注意谓词从左到右的组合

  • create
    call谓词创建日期相等谓词

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

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

  • 下面是一个将谓词显示为OData查询子句的巧妙技巧:

    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);
    
    它打印

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

    约会很棘手! 你没问,但我会给你0.02美元的约会风险

    首先,我想确定数据库中的日期没有时间成分。。。或者这个查询根本不起作用,因为数据库中没有“StartDate”会通过平等性测试

    其次,像这样使用文本日期有国际化问题的风险。
    '1/2/2014'
    应该是1月2日还是2月1日?在下一个例子中,我将通过提供真实的日期值来消除歧义

    // 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 )));
    
    这个谓词(与上面的一样)产生

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

    第三,现在你有一个潜在的时区问题。我希望通过在客户机和服务器上都使用UTC来消除时区影响所以我实际上会写

    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');
    
    此谓词生成:

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


    @自由职业者的答案是正确的。。。但对我的口味来说有点冗长

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

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

    Breeze在我的查询中抛出了一个错误

    错误:“1/2/2014”不是有效的日期时间

    这里有一个替代方案:

    var query= new breeze.EntityQuery().from("GetTables").where(andPred);
    
    注意谓词从左到右的组合

  • create
    call谓词创建日期相等谓词

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

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

  • 下面是一个将谓词显示为OData查询子句的巧妙技巧:

    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);
    
    它打印

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

    约会很棘手! 你没问,但我会给你0.02美元的约会风险

    首先,我想确定数据库中的日期没有时间成分。。。或者这个查询根本不起作用,因为数据库中没有“StartDate”会通过平等性测试

    其次,像这样使用文本日期有国际化问题的风险。
    '1/2/2014'
    应该是1月2日还是2月1日?在下一个例子中,我将通过提供真实的日期值来消除歧义

    // 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 )));
    
    这个谓词(与上面的一样)产生

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

    第三,现在你有一个潜在的时区问题。我希望通过在客户机和服务器上都使用UTC来消除时区影响所以我实际上会写

    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');
    
    此谓词生成:

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


    提供更多关于你到底想要什么的信息?我很清楚这个问题。事实上,这个问题和我的非常接近,这对我很有帮助。我认为,如果你不知道微风,那么它就一点也不清楚。但是,你不应该担心理解一个关于你不熟悉的话题的问题。。。请注意,自由职业者和沃德都明白了。请提供更多关于你们到底想要什么的信息?我很清楚这个问题。事实上,这个问题和我的非常接近,这对我很有帮助。我认为,如果你不知道微风,那么它就一点也不清楚。但是,你不应该担心理解一个关于你不熟悉的话题的问题。。。请注意,自由职业者和沃德都明白了。第二个谓词中有一个拼写错误,缺少运算符上的引号。第二个谓词中有一个拼写错误,缺少运算符上的引号。无法。。。向上投票。。。够了…谢谢@Ward令人敬畏的回答,我不明白的是Breeze是如何处理odata运算符优先级的(并且总是在或之前进行评估)。现在我看到Predicate.or和Predicate.or,并将谓词括在括号中,这样我就可以控制