如何编写等价于以下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和名称测试
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和名称测试
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,并将谓词括在括号中,这样我就可以控制