Предикат BreezeJS: как да търсите множество типове данни?

Имам .NET клас от страна на сървъра с множество типове данни като низ, 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?

Всички отговори са високо оценени!


person Phat Tran    schedule 17.09.2014    source източник


Отговори (2)


Трябва да поставите всеки предикат в или (само първия няма да трябва да поставите в или) и да ги свържете като този пример:

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);
person Sebastian    schedule 17.09.2014
comment
изглежда работи, но вече направих по този начин: създавам 2 предиката: function stringPredicateFn(filterValue) { return Predicate.create('string'.toString(), 'contains', filterValue) .or('email', 'contains', filterValue) .or('phone', 'contains', filterValue) .or('uRL', 'contains', filterValue) .or('zip', 'contains', } и function numericPredicateFn(filterValue) { return Predicate.create('age', '==', filterValue) .or('integer', '==', filterValue) .or('creditCard', '==', filterValue);}, след което правя заявка: .**where(numericPredicate.or(stringPredicate))** първият предикат е добре, вторият 400 е лоша заявка - person Phat Tran; 17.09.2014
comment
Тогава може да е проблем с вашата уеб услуга. Погледнахте ли съобщението за грешка от услугата? Ако е WCF-услуга, трябва да поставите config.UseVerboseErrors = true; вътре във функцията InitializeService. - person Sebastian; 17.09.2014
comment
Използвам .NET API контролер с OData и Breeze заедно, проблемът възниква със сървъра queryString/OData, позволете ми да разгледам това. Благодаря ви много за помощта! - person Phat Tran; 17.09.2014
comment
Получих тази грешка, когато се опитвам да търся 1 низ (имейл) и 1 числов (възраст) обект: A binary operator with incompatible types was detected. Found operand types 'Edm.Int32' and 'Edm.String' for operator kind 'Equal'. добре е да търся цяло число като 123, но възниква грешка, когато търся низ като abc код: var pred = Predicate.create('age', '==', searchText).or('email', 'contains', searchText) `breeze.EntityQuery. from('Validations').where(pred)... - person Phat Tran; 17.09.2014
comment
Така че тази грешка не е свързана с първия ви въпрос, мисля. - person Sebastian; 17.09.2014

Няма да можете да търсите в нетекстови полета с низови оператори като „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] );
person Jay Traband    schedule 17.09.2014