我有一个.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的多种数据类型?
任何答案都非常感谢!
答案 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] );