Я вижу два способа, которыми вы можете динамически генерировать лямбда-выражения. Вы можете попробовать Reflection.Emit для генерации IL (байт-кода .Net) напрямую и вызвать их как лямбду, или вы можете использовать System.CodeDom и Microsoft.CSharp.CSharpCodeProvider для генерации кода из конструкций более высокого уровня. Что вы хотите сделать, зависит от того, как вы хотите, чтобы пользователь вводил этот материал. Если вы хотите, чтобы пользователь написал C #, вы можете просто использовать встроенный компилятор.
Генерация Linq динамически должна быть проще. Вы должны иметь возможность генерировать запросы LINQ как деревья выражений во время выполнения, а затем передавать их в IQueryable для выполнения. Я бы посоветовал вам изучить документацию по IQueryable, чтобы узнать больше об этом. Другим способом было бы заранее определить пару запросов linq, а затем позволить пользователю связать их вместе. Это должно быть работоспособным, потому что любой запрос Linq возвращает IEnumerable, который может быть использован следующим запросом Linq.