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

BreezeJS Predicate: how to search for multiple data types?

本文关键字:搜索 数据类型 Predicate 何搜索 BreezeJS      更新时间:2023-09-26

我有一个.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.或(predicate1,predicate2,Predicate 3)

但它返回了错误的请求。

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

问题1:有没有办法将Breeze数据转换为字符串,这样我就需要为所有字段指定一个谓词,只搜索字符串?

例如:微风。谓词.create('date'.toString(),'contains','09/15')

问题2:如果q1没有答案,有没有更好/体面的方法用Breeze搜索多个数据类型?

非常感谢您的回答!

您需要将每个谓词放在or中(只需将第一个谓词放在或中),并像下面这样连接它们:

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

您将无法使用字符串运算符(如"startsWith"、"endsWith"或"contains")搜索非文本字段,同样,您也无法使用运算符(如"gt"或"lt")搜索字符串或布尔字段。这是因为EF(以及Mongo和其他ORM提供者)没有提供这样的服务器查询的底层支持。

您可以通过将谓词组合在一起来查询相同类型的所有字段:(类似于Sebastian的答案)。所以对于字符串,类似这样的东西:

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