SELECT 
    * 
FROM
    Table
WHERE 
  FirstName = 'Wilson' 
  AND (START_DATE = '1/1/2014' OR START_DATE > '1/2/2014')
有帮助吗?

解决方案

假设你有控制器,它有:

     [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);

其他提示

@freelancer的答案朝着正确的方向前进。..但对我的口味来说有点冗长。

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

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

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

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

这里有一个替代方案:

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 call返回一个谓词,该谓词是第一个谓词和第二个日期条件的OR。这是or谓词

  3. 第三个 and call返回OR-谓词和name-test的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中的所有操作来消除时区影响。 所以我会写:

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')

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top