BreezeJS Predicate:如何搜索多种数据类型?

时间:2014-09-17 04:58:46

标签: javascript types breeze predicate

我有一个.NET服务器端类,有多种数据类型,如string,int,decimal和Date。在客户端,我想搜索每个列,但Breeze谓词可以一次搜索1个数据类型。

  

公共部分类验证{

    public Guid ValidationID { get; set; } (dont search for this field)
    public int Integer { get; set; }
    public string String { get; set; }
    public DateTime? Date { get; set; }
    public DateTime? BeforeDate { get; set; }
    public DateTime? AfterDate { get; set; }
    public int? Age { get; set; }
    public decimal? CreditCard { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string URL { get; set; }
    public string Zip { get; set; }
}

然后我试了

  

breeze.Predicate.or(predicate1,predicate2,predicate3)

但它返回了错误的请求。

然后我使用javascript检查结果数据是否返回0对象,我将搜索另一种类型(字符串然后数字然后日期)

问题1 :有没有办法将Breeze数据转换为字符串,因此我需要为所有字段添加1个谓词并仅搜索字符串?

  

例如:breeze.Predicate.create('date' .toString(),'contains','09/15')

问题2 :如果q1没有答案,是否有更好/更好的方式来搜索Breeze的多种数据类型?

任何答案都非常感谢!

2 个答案:

答案 0 :(得分:0)

你需要将每个谓词放在一个或(只有第一个你不必放入一个或者)并且像这个例子一样连接它们:

var query = breeze.EntityQuery.from("Validation");
var predicate1 = breeze.Predicate.create("ValidationID", "contains", searchText);
var predicate2 = breeze.Predicate.create("Email", "contains", searchText);
query.where(predicate1.or(predicate2));
manager.executeQuery(query);

答案 1 :(得分:0)

您将无法使用“startsWith”,“endsWith”或“contains”等字符串运算符搜索非文本字段,同样地,您将无法使用“gt”等运算符搜索字符串或布尔字段'为lt'。这是因为EF(以及Mongo和其他ORM提供程序)不提供此类服务器查询的底层支持。

你可以做的是通过或者将你的谓词一起查询相同类型的所有字段:(类似于塞巴斯蒂安的回答)。所以对于像这样的字符串:

var Predicate = breeze.Predicate;
var query = breeze.EntityQuery.from("Validation");

var searchText = 'findMe';
// Predicate.create works as well
var p1 = new Predicate("Email", "contains", searchText); 
var p2 = new Predicate("Phone", "contains", searchText);
var p3 = new Predicate("Zip", "contains", searchText);
query.where(Predicate.or[ p1, p2, p3] );

和日期:

searchDate = new Date(2014,0,1);
var p1 = new Predicate("BeforeDate", "==", searchDate); 
var p2 = new Predicate("AfterDate", "==", searchDate);
query.where(Predicate.or[ p1, p2] );

您还可以在查询中使用任何数据类型相应的函数,即

var searchYear = 2014; 
// Predicate.create works as well
var p1 = new Predicate("year(BeforeDate)", "==", searchYear); 
var p2 = new Predicate("year(AfterDate)", "==", searchYear);
query.where(Predicate.or[ p1, p2] );

你也可以'或'将不同类型的谓词放在一起,但你显然不会使用相同的搜索'值'。但是,你可以这样做。

var searchDate = new Date(2014,0,1);
var searchText = searchDate.toString();

// Predicate.create works as well
var p1 = new Predicate("Email", "contains", searchText); 
var p2 = new Predicate("BeforeDate", "==", searchDate); 
query.where(Predicate.or[ p1, p2] );