SELECT
*
FROM
Table
WHERE
FirstName = 'Wilson'
AND (START_DATE = '1/1/2014' OR START_DATE > '1/2/2014')
答案 0 :(得分:5)
@自由职业者的答案朝着正确的方向前进......但我的口味有点冗长。
在分析查询时,我也不相信我可以指望将'1/1/2014'自动转换为DateTime
值。当我尝试这样的谓词时:
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);
请注意从左到右的谓词组合。
create
调用谓词创建日期等于谓词
or
调用返回谓词,该谓词是第一个谓词和第二个日期条件的OR。这是OR谓词
第三个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 )));
打印
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');
这个谓词(如上所述)产生
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');
这个谓词产生:
OData谓词:((StartDate eq datetime'2014-01-01T00:00:00.000Z')或(StartDate gt datetime'2014-01-02T00:00:00.000Z'))和(FirstName eq'Wilson' )
答案 1 :(得分:2)
假设你有控制器,它有:
[HttpGet]
public IQueryable<Tables> GetTables()
{
return _contextProvider.Context.Set<Tables>();
}
创建谓词:
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
查询将是:
var query= new breeze.EntityQuery().from("GetTables").where(andPred);