Мы должны решить эту проблему в LINQ-to-Just-About-Everything. Например, при выполнении LINQ-to-SQL:
var results = from c in customers where c.City == "London" select c.Name;
каким-то образом содержимое лямбд c=>c.City == "London"
и c=>c.Name
должно оказаться на сервере SQL в форме, понятной серверу. Ясно, что мы не можем сохранить лямбды на сервере.
Вместо этого мы превращаем лямбды в деревья выражений, анализируем деревья выражений во время выполнения, строим из него фактическую строку SQL и отправляем эту строку на сервер для обработки.
Вы можете сделать то же самое. Создайте язык запросов для вашего сервера. На стороне клиента превратите лямбды в деревья выражений. Проанализируйте их во время выполнения, превратите результат в строку на языке запросов, а затем отправьте запрос в службу.
Если вам интересно, как это работает в LINQ, архитектор LINQ-to-SQL Мэтт Уоррен написал большую серию статей в блоге о том, как сделать это самостоятельно:
http://blogs.msdn.com/b/mattwar/archive/2008/11/18/linq-links.aspx