Вы можете использовать динамический Linq для построения выражений Linq во время выполнения - просто добавляя методы к существующему запросу Linq (перед его выполнением).
Сказав это, понятие класса «QueryBuilder», как упомянул Крис, имеет сомнительную ценность.
Строго говоря, Linq сам по себе является построителем запросов, поскольку он принимает оператор Linq и создает «граф», который поставщик запросов может затем использовать для выполнения основной работы (компиляция оператора SQL для Linq-To-SQL). или перечисление объектов Linq-For-Objects).
Если вы хотите предложить конечным пользователям возможность динамически создавать запросы, рассмотрите возможность создания пользовательского интерфейса, который создает оператор Linq, добавляя методы запросов, как указал Крис. Помните, что с помощью запроса Linq вы можете добавить столько выражений, сколько захотите - запрос выполняется только при отключении перечислителя.
т.е. Чтобы выбрать самого старого клиента в возрасте до 65 лет по имени Джим:
Dim qry = From customer in DataContext.Customers
qry = qry.Where( Function (c as Customer) c.Name="Jim" )
qry = qry.Where( Function (c as Customer) c.Age < 65 )
qry = qry.OrderByDescending( Function (c as Customer) c.Age )
qry = qry.Take(1)
Dim oldJim as Customer = qry.FirstOrDefault()
Метод FirstOrDefault, такой как ToArray или For Each, отключает перечислитель и обрабатывает запрос.
Надеюсь, это поможет!