Javascript BreezeJS谓词:如何搜索多种数据类型?

Javascript BreezeJS谓词:如何搜索多种数据类型?,javascript,types,breeze,predicate,Javascript,Types,Breeze,Predicate,我有一个.NET服务器端类,它有多种数据类型,如string、int、decimal和Date。在客户端,我希望搜索每一列,但Breeze谓词可以一次搜索一个数据类型 公共部分类验证{ 然后我试着 breeze.Predicate.or(谓词1、谓词2、谓词3) 但它返回了错误的请求 然后我使用javascript检查结果数据是否返回0对象,我将搜索另一种类型(字符串、数字、日期) 问题1:是否有办法将Breeze数据转换为字符串,以便我需要为所有字段使用一个谓词,并只搜索字符串 例如:bree

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

公共部分类验证{

然后我试着

breeze.Predicate.or(谓词1、谓词2、谓词3)

但它返回了错误的请求

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

问题1:是否有办法将Breeze数据转换为字符串,以便我需要为所有字段使用一个谓词,并只搜索字符串

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

问题2:如果问题1没有答案,有没有更好/更合适的方法用Breeze搜索多个数据类型


非常感谢您的回答!

您需要将每个谓词放在or中(只有第一个谓词不必放在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] );

它似乎可以工作,但我已经这样做了:我创建了两个谓词:
函数stringPredicateFn(filterValue){return Predicate.create('string'.toString(),'contains',filterValue)。或者('email','contains',filterValue)。或者('phone','contains',filterValue)。或者('uRL','contains',filterValue)。或者('zip','contains',}
函数numericPredicateFn(filterValue){return Predicate.create('age','==',filterValue)。或('integer','==',filterValue)。或('creditCard','==',filterValue);}
然后我查询:.*where(numericPredicate.or(stringPredicate))**第一个谓词ok,第二个谓词400 bad Requests可能是您的Web服务有问题。您是否查看了该服务的错误消息?如果是WCF服务,则需要将config.UseVerboseErrors=true;放在InitializeService函数中。我将.NET API控制器与OData和Breeze一起使用,问题发生在queryString/OData服务器,让我看看。非常感谢您的帮助!我在尝试搜索1个字符串(电子邮件)和1个数字(年龄)对象时遇到此错误:
检测到一个具有不兼容类型的二进制运算符。找到了操作数类型“Edm.Int32”和运算符类型“Equal”的“Edm.string”。
可以搜索类似的整数“123”,但在搜索类似“abc”代码的字符串时出错:
var pred=Predicate.create('age','=','searchText')或('email','contains',searchText)
`breeze.EntityQuery.from('Validations')。其中(pred)…所以这个错误与您的第一个问题无关。
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] );