Предикат BreezeJS: как искать несколько типов данных?

У меня есть серверный класс .NET с несколькими типами данных, такими как строка, целое число, десятичное число и дата. На стороне клиента я хочу искать каждый столбец, но предикат 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; }
}

Затем я попытался

бриз.Предикат.или(предикат1, предикат2, предикат3)

но он вернул неверный запрос.

Затем я использую javascript, чтобы проверить, возвращают ли данные результатов объект 0, я буду искать другой тип (строка, затем число, затем дата)

Вопрос 1. Есть ли способ преобразовать данные Breeze в строку, чтобы мне понадобился 1 предикат для всех полей и выполнялся поиск только по строке?

например: breeze.Predicate.create('date'.toString(), 'содержит', '15 сентября')

Вопрос 2. Если нет ответов на вопрос 1, есть ли лучший/достойный способ поиска нескольких типов данных с помощью 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('Проверки').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