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

时间:2014-06-05 06:33:52

标签: sql breeze

SELECT 
    * 
FROM
    Table
WHERE 
  FirstName = 'Wilson' 
  AND (START_DATE = '1/1/2014' OR START_DATE > '1/2/2014')

2 个答案:

答案 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);

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

  1. create调用谓词创建日期等于谓词

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

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

  4. 这是一个很好的技巧,可以将谓词显示为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);