Создатель предикатов 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() также предикаты.

Любая помощь с благодарностью

0 ответов

Другие вопросы по тегам