Создатель предикатов binbin ling пытается добавить AND (field1 = string1 или field1 = string2) в конец предиката
Я использую предикатный сборщик bin bin и у меня работает запрос, но он очень медленный при использовании.contains, мне нужно, чтобы он выполнял точное сопоставление, а не содержал, поскольку он генерирует более быстрый запрос, когда я тестирую оба непосредственно на сервере SQL. В идеале я хочу иметь возможность объединить 2 предиката.
Это то, что у меня было раньше.
Expression<Func<MyModel, bool>> filter = null;
var predicate = PredicateBuilder.True<MyModel>();
Затем я проверяю массив возможных значений фильтра следующим образом:
if(!.string.IsNullOrEmpty(filterVal1))
predicate = predicate.And(x=>x.someField = filterVal1)
if(!.string.IsNullOrEmpty(filterVal2))
predicate = predicate.And(x=>x.someOtherField = filterVal2)
и т. д. и т. д. Я создаю его, а затем назначаю его моему фильтру, который передает его в мою функцию поиска, которая корректно извлекает все данные (я делаю там фильтр.Expand()).
Все работает отлично, за исключением случаев, когда я хочу проверить количество строковых значений в определенном поле, EF-сгенерированный код очень сложен и имеет много вложений, что замедляет его. Вот что я имел в своем предикате:
if (!string.IsNullOrEmpty(listOfValues))
predicate = predicate.And(x => listOfValuesArray.Contains(x.someField.ToString()));
Но если я жестко закодирую этот вид теста: предикат. И (x=>x.someField=="listOfValuesArray1" || x.someField== "listOfValuesArray1"); и т. д. запрос, производимый EF, намного лучше, и все снова выполняется быстро.
Поэтому мне нужно иметь возможность сделать вышеупомянутый жестко запрограммированный запрос динамическим, так как у меня есть массив / список значений строки f, которые мне нужно проверить в определенном поле как AND(field = value1 или field = value2 ...field=valueN)
Я попытался создать 2 предиката и соединить их с AND (предикат1, предикат2), но затем я получаю ошибку Entity Framework, которая говорит мне использовать Expand (), который я уже использую. Я попытался Comnpile() также предикаты.
Любая помощь с благодарностью