我如何编写一个breeze谓词等价于下面的SQL[closed]
题
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);
注意 谓词的从左到右组成.
该
create
调用谓词创建日期相等谓词该
or
call返回一个谓词,该谓词是第一个谓词和第二个日期条件的OR。这是or谓词第三个
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')