LinqToSql: ExecuteQuery с результатом ExecuteQuery?

Я использую этот код, чтобы получить всех клиентов из моей базы данных ...

Dim customerResult = db.ExecuteQuery(Of VIEW_customers)("SELECT * FROM TOPL_Customers").ToList

Теперь, когда у меня есть все клиенты, выбранные из базы данных, я хочу выполнить «фильтрующий» запрос к customerResult - как мне это сделать?

Надеялся на что-то подобное ...

Dim filterResult = customerResult.ExecuteQuery(Of VIEW_customers)("SELECT * WHERE active=1").ToList

Какие-либо предложения? Я не хочу дважды запрашивать базу данных.

Мне нужно использовать строку в качестве поискового запроса, потому что она динамическая.

Спасибо


person MojoDK    schedule 19.11.2014    source источник
comment
Разве вы не можете отправить запрос фильтра в базу данных, чтобы получить отфильтрованные результаты? например присоединиться к обоим запросам   -  person Piyush Parashar    schedule 19.11.2014
comment
Извините за непонятность. Мой фильтр динамический, и я не знаю заранее, какие поля будут фильтровать пользователи. Я обновил свой вопрос.   -  person MojoDK    schedule 19.11.2014


Ответы (2)


Попробуй это:

var filteredResult = from a in customerResult
                     //Add suitable filter condition based on column values
                     where a.Active == 1
                     select a;
person Piyush Parashar    schedule 19.11.2014
comment
Извините за непонятность. Мой фильтр динамический, и я не знаю заранее, какие поля будут фильтровать пользователи. - person MojoDK; 19.11.2014
comment
Даже если он является динамическим, получив результат из базы данных, вы можете построить выражение предложения WHERE на основе пользовательского ввода. Я предполагаю, что вы будете проверять значения столбцов на пользовательские данные, которые могут быть построены динамически. - person Piyush Parashar; 19.11.2014
comment
Ну, я не знаю отфильтрованные столбцы впереди ... может быть, пользователь будет фильтровать ... ГДЕ имя КАК '% peter%' ... и другой пользователь будет фильтровать ... ГДЕ имя КАК '% peter%' И возраст ›30 ... Итак, я не могу жестко запрограммировать фильтр - мне нужно создать его динамически и запустить против моего customerResult. - person MojoDK; 19.11.2014
comment
Извините, если я не понял. Я хотел сказать, что вы не знаете заранее количество фильтров, но вы указываете общее количество полей, над которыми нужно работать, правильно? Так что, возможно, вам нужно перебрать все строки в результате и проверить, был ли конкретный фильтр предоставлен пользователем, например. Назовите, а затем сопоставьте строку с этим именем. И так далее для всех предоставленных фильтров. Но лучше всего сделать это в базе данных одним запросом. Я могу добавить код для зацикливания, если вы думаете, что это поможет. - person Piyush Parashar; 19.11.2014

Я предполагаю, что VIEW_customers представляет вашу модель для набора результатов.

Вы можете использовать Expressions для создания серии фильтров, а затем объединить их вместе, чтобы создать единое динамическое предложение where для работы с вашим набором результатов.

Expression<Func<VIEW_customers, bool>> predicate1 = x => x.someField == 'something';
Expression<Func<VIEW_customers, bool>> predicate2 = x => x.otherField == 'something else';

Затем вы можете объединить их вместе с помощью .And или .Or в зависимости от ситуации:

Expression<Func<VIEW_customers, bool>> combinedPredicate = predicate1.And(predicate2);

Вы можете связать любое количество из них вместе; это логическая логика (в основном думайте, что каждое дополнительное предложение заключено в круглые скобки). Когда вы будете готовы использовать предикат, скомпилируйте его и запустите как обычное предложение .Where.

Func<VIEW_customers, bool> compiledPredicate = combinedPredicate.Compile();
var results = customerResult.Where(compiledPredicate);
person JBC    schedule 19.11.2014